device_create与现有的设备名称

我正在学习如何将字符设备驱动程序编写为Linux的可dynamic加载模块。 通常,我使用以下顺序的函数调用来注册设备,并创build出现在/dev/下的设备文件:

 alloc_chrdev_region(&first, 0, 1, "myclass"); myclass = class_create(THIS_MODULE, "myclass"); device_create(myclass, NULL, first, NULL, "mydevicefile"); cdev_init(&c_dev, &fops); cdev_add(&c_dev, first, 1); 

设备文件然后出现在/dev/mydevicefile ,我可以与它交互。

这让我想知道如果传递一个现有的设备文件名而不是“mydevicefile”会发生什么:

 device_create(myclass, NULL, first, NULL, "null"); 

这导致/dev/null被我的字符设备文件所取代 – 而且更多地涉及到:在我的控制台中,来自期待原始/dev/null守护进程的错误消息的猛击。 甚至不删除我的虚假null模块解决这个问题。

在实践中,不应该有一个与我的模块使用的名称相同的现有设备文件,理论上可能覆盖另一个设备文件仍然困扰着我。

如何防止设备文件已经存在与我打算使用的名称相同的名称?

更新 :我想我真正绑定找出是为什么udev是允许更换。

所有设备驱动程序(在/dev )基本上都是文件类型,这意味着您检查设备文件是否已经存在的方式,与检查是否存在任何文件的方式相同。 一种方法是使用:

 #include <unistd.h> // for F_OK and access() ... if( access( "/dev/null", F_OK ) != -1 ) { printf("File already exists!\n"); } else { printf("File doesn't exist!\n"); // create new dev here } 

由于/dev/null 确实存在,你会看到“File exists!” 这里

 This resulted in /dev/null being replaced by my character device file 

您可以使用mknod实用程序创建一个新的NULL设备文件

sudo mknod -m 0666 / dev / null c 1 3

设备节点的创建通常由用户空间操作来处理。 这是udev的目的:通过解释sysfm的数据来填充和处理用户空间/dev/目录。

传递给device_create函数的名称只是一个建议的默认名称,与sysfm其他关于设备的数据一起出现在sysfm 。 最终由用户空间实用程序或用户决定如何处理该数据。

遇到同名设备时, udev的默认行为就是用新设备节点覆盖旧设备节点: http : //marc.info/?l = linux-hotplug&m = 125559736630729