我遇到一个问题,第三方应用程序打开了不应该打开的设备节点。
我编写了一个 SPI 从设备驱动程序,用于对消息进行一些处理。当驱动程序在“初始化模式”下加载时,它仅回复特定消息。要重新初始化通信,我必须卸载并重新加载驱动程序。问题是系统有一个以 root 身份运行的第三方应用程序,它打开所有字符设备。使这一切顺利进行的唯一方法是停止应用程序并卸载,这会给整个项目带来巨大的问题。
是否可以在没有实际设备节点的情况下打开与字符设备的连接?现在我使用 fopen('/dev/spi') 一切正常,直到我需要重新加载并出现上述问题。是否可以进行任何类型的系统调用,从而在没有实际 /dev/spi 文件的情况下生成特定主/次节点号的文件描述符?
答案1
如果有问题的应用程序仅打开/dev
树中的设备节点那么你可以将你的设备节点放在其他地方,如果它适用于你自己的程序。
设备节点所在的文件系统必须设置挂载选项,dev
以便对设备节点文件进行特殊处理。
(免责声明:我没有测试过这个,但我以前做过类似的事情......)
tmpfs
例如,一个示例是安装一个小型文件系统,/my-dev/
并在那里创建设备节点。
mkdir -p /my-dev
mount -t tmpfs -o dev,size=<size> tmpfs /my-dev
mknod /my-dev/spi <type> <maj> <min>
在哪里<size>
是 tmpfs 的大小,<type>
是设备节点类型,<maj> <min>
是主要:次要设备编号;分别参见mount
和的手册页mknod
。
...然后fopen("/my-dev/spi")
在您的程序中使用。
(当然,请确保该udev
或类似的内容不是为设备创建一个节点。)