ubuntu 10.04下创建多个子设备节点出现节点已存在的问题

时间:2021-01-13 19:50:28
因为需要驱动支持多个同样设备,于是手动mknod的时候,增加了子设备节点,但是编译的时候提示节点已存在,而在dev下面也只有一个设备节点文件。
例如:mknod /dev/en3 95 
这样是创建一个设备节点,要创建多个的话:
mknod /dev/en3 95 0;\
mknod /dev/en3 95 1;\
这时候就会报错,在第二次创建的时候出现file exists。

6 个解决方案

#1


现在很多驱动都是自动创建节点的了。 
LZ搜索下自动创建方面的内容, 把驱动注册部分的代码修改下,就不需要自动mknod了。

另 手动的话, mknod /dev/xx c 253 0  我一直使用的这样的方式,
c 代表字符型设备, 253  在/proc/devices中注册的主设备号,  0是第一个这样类型的设备。
LZ的方法没用过, 可以检查下mknod的写法。。

#2


引用 1 楼  的回复:
现在很多驱动都是自动创建节点的了。 
LZ搜索下自动创建方面的内容, 把驱动注册部分的代码修改下,就不需要自动mknod了。

另 手动的话, mknod /dev/xx c 253 0  我一直使用的这样的方式,
c 代表字符型设备, 253  在/proc/devices中注册的主设备号,  0是第一个这样类型的设备。
LZ的方法没用过, 可以检查下mknod的写法。。

如果要同时创建多个同类型是设备你手动怎么创建?主设备一致,次级设备不一样

#3



326     raw_class = class_create(THIS_MODULE, "raw");
327     if (IS_ERR(raw_class)) {
328         printk(KERN_ERR "Error creating raw class.\n");
329         cdev_del(&raw_cdev);
330         ret = PTR_ERR(raw_class);
331         goto error_region;
332     }
333     raw_class->devnode = raw_devnode;
334     device_create(raw_class, NULL, MKDEV(RAW_MAJOR, 0), NULL, "rawctl");
335 

这个linux内核中raw.c中自动创建设备文件节点的,你参考一下326行和334行

#4


引用 3 楼  的回复:
C/C++ code

326     raw_class = class_create(THIS_MODULE, "raw");
327     if (IS_ERR(raw_class)) {
328         printk(KERN_ERR "Error creating raw class.\n");
329         cdev_del(&raw_cdev);
33……

另外raw_class的定义为:
static struct class *raw_class;

#5


引用 4 楼  的回复:
引用 3 楼  的回复:

C/C++ code

326     raw_class = class_create(THIS_MODULE, "raw");
327     if (IS_ERR(raw_class)) {
328         printk(KERN_ERR "Error creating raw class.\n");
329         cdev_de……

我这么做过,但是还是没有在/dev/下创建成功设备文件,所以放弃打算手动创建...

#6


引用 3 楼  的回复:
C/C++ code

326     raw_class = class_create(THIS_MODULE, "raw");
327     if (IS_ERR(raw_class)) {
328         printk(KERN_ERR "Error creating raw class.\n");
329         cdev_del(&raw_cdev);
33……

这两个函数应该是在_init里面使用的对吧?

#1


现在很多驱动都是自动创建节点的了。 
LZ搜索下自动创建方面的内容, 把驱动注册部分的代码修改下,就不需要自动mknod了。

另 手动的话, mknod /dev/xx c 253 0  我一直使用的这样的方式,
c 代表字符型设备, 253  在/proc/devices中注册的主设备号,  0是第一个这样类型的设备。
LZ的方法没用过, 可以检查下mknod的写法。。

#2


引用 1 楼  的回复:
现在很多驱动都是自动创建节点的了。 
LZ搜索下自动创建方面的内容, 把驱动注册部分的代码修改下,就不需要自动mknod了。

另 手动的话, mknod /dev/xx c 253 0  我一直使用的这样的方式,
c 代表字符型设备, 253  在/proc/devices中注册的主设备号,  0是第一个这样类型的设备。
LZ的方法没用过, 可以检查下mknod的写法。。

如果要同时创建多个同类型是设备你手动怎么创建?主设备一致,次级设备不一样

#3



326     raw_class = class_create(THIS_MODULE, "raw");
327     if (IS_ERR(raw_class)) {
328         printk(KERN_ERR "Error creating raw class.\n");
329         cdev_del(&raw_cdev);
330         ret = PTR_ERR(raw_class);
331         goto error_region;
332     }
333     raw_class->devnode = raw_devnode;
334     device_create(raw_class, NULL, MKDEV(RAW_MAJOR, 0), NULL, "rawctl");
335 

这个linux内核中raw.c中自动创建设备文件节点的,你参考一下326行和334行

#4


引用 3 楼  的回复:
C/C++ code

326     raw_class = class_create(THIS_MODULE, "raw");
327     if (IS_ERR(raw_class)) {
328         printk(KERN_ERR "Error creating raw class.\n");
329         cdev_del(&raw_cdev);
33……

另外raw_class的定义为:
static struct class *raw_class;

#5


引用 4 楼  的回复:
引用 3 楼  的回复:

C/C++ code

326     raw_class = class_create(THIS_MODULE, "raw");
327     if (IS_ERR(raw_class)) {
328         printk(KERN_ERR "Error creating raw class.\n");
329         cdev_de……

我这么做过,但是还是没有在/dev/下创建成功设备文件,所以放弃打算手动创建...

#6


引用 3 楼  的回复:
C/C++ code

326     raw_class = class_create(THIS_MODULE, "raw");
327     if (IS_ERR(raw_class)) {
328         printk(KERN_ERR "Error creating raw class.\n");
329         cdev_del(&raw_cdev);
33……

这两个函数应该是在_init里面使用的对吧?