打开字符设备而不创建设备节点

打开字符设备而不创建设备节点

我遇到一个问题,第三方应用程序打开了不应该打开的设备节点。

我编写了一个 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或类似的内容不是为设备创建一个节点。)

相关内容