`mknod` 的相反操作是什么?

51

我正在学习如何编写字符设备驱动程序,使用内核模块编程指南并使用mknod/dev中创建了一个节点来与我的驱动程序通信。

然而,在查看手册页和观察到rmnod不存在的情况下,我找不到任何明显的方法来删除它。

什么是正确的方法来撤销mknod的效果,安全地移除在/dev中创建的节点?


8
可能只是 rm - Keith Thompson
那种方法是安全且可靠的吗?意思是它不会在内核中留下任何悬挂指针? - merlin2011
4
就内核而言,节点只是磁盘上的数据。只有在打开它时,内核才会对其进行任何操作。如果不检查,我会怀疑通常的类Unix文件行为适用于这种情况,即打开的设备可能仍然保持打开状态,即使您从磁盘中删除了用于打开它的节点。 - Chris Stratton
1
如果用户空间操作能够在内核中留下悬空指针,我会非常担心。很确定这将被称为内核漏洞。 - tangrs
2个回答

59

正确的命令只是rm :)

mknod创建的设备节点只是包含设备主要和次要编号的文件。当您第一次访问该文件时,Linux会查找广告该主/次要的驱动程序并加载它。然后,您的驱动程序处理与该文件的所有I/O。

当您删除设备节点时,通常的Un * x文件行为适用:Linux将等待直到没有对该文件的更多引用,然后它将从磁盘中删除。

您的驱动程序实际上不会注意到这一点。Linux不会自动卸载模块。您的驱动程序将不再接收任何请求但将准备好以防有人重新创建设备节点。


1
您可能正在寻找一个函数而不是一个命令。unlink()就是答案。如果没有进程打开文件/特殊文件,unlink()将删除该文件/特殊文件。如果有任何进程打开了该文件,则该文件将保留,直到最后一个引用它的文件描述符被关闭。在此处阅读更多信息:http://man7.org/linux/man-pages/man2/unlink.2.html

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接