免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6174 | 回复: 10
打印 上一主题 下一主题

用open打开字符设备时的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-07 10:37 |只看该作者 |倒序浏览
写了个字符设备,

然后用mknod /dev/ring c 251 0建立设备节点文件,一切正常,

症状1:写一个测试程序,在下面这一个步骤报错:

testdev = open("/dev/ring1",O_RDWR);
if (testdev == -1){
    printf("open error\n");
    exit(0);
}

一直显示open error,

用chmod 666 /dev/ring1也没用,

症状2
使用cat /dev/ring1的结果是:
[root@domain0 hgnttab]# cat /dev/ring1
cat: /dev/ring1: No such device or address

而用ls -lh 则可以看到该设备:
[root@domain0 hgnttab]# ls -lh /dev/ring1
crw-rw-rw- 1 root root 251, 0 2009-07-07 10:24 /dev/ring1

怪事,明明有这个文件,为什么用cat时,还显示 No such device or address,应该显示Operation not permitted才对,

求高手解答。

论坛徽章:
0
2 [报告]
发表于 2009-07-07 10:54 |只看该作者

re

你的驱动程序所获得的主设备号和从设备号确定是 251:0吗?

论坛徽章:
0
3 [报告]
发表于 2009-07-07 10:57 |只看该作者
是的,我用的是以下方法
456      int result;
457     dev_t dev_num;

471     result = alloc_chrdev_region(&dev_num, minor_num, 1,"gnttab-dev");
472     major_num = MAJOR(dev_num);
473     printk("the major_num is: %d\n",major_num);
47
475     if (result < 0){
476         printk(KERN_WARNING "gnttab-dev: can't get major %d\n", major_num);
477         goto err;
478     }

论坛徽章:
0
4 [报告]
发表于 2009-07-07 11:03 |只看该作者

用lsmod 看看模块加载了吗?

RT

论坛徽章:
0
5 [报告]
发表于 2009-07-07 11:07 |只看该作者

回复 #4 奇门遁甲-lu 的帖子

加载了。

论坛徽章:
0
6 [报告]
发表于 2009-07-07 11:13 |只看该作者
调试了下,模块里的open函数根本没有调用

论坛徽章:
0
7 [报告]
发表于 2009-07-07 11:21 |只看该作者

帖代码?

RT

论坛徽章:
0
8 [报告]
发表于 2009-07-07 11:26 |只看该作者
问题解决了,问题在于我的代码这样写似乎不对。

int result;
dev_t dev_num;

result = alloc_chrdev_region(&dev_num, minor_num, 1,"gnttab-dev");
major_num = MAJOR(dev_num);
printk("the major_num is: %d\n",major_num);

if (result < 0){
     printk(KERN_WARNING "gnttab-dev: can't get major %d\n", major_num);
     goto err;
  }

我想让模块自动分配一个主设备号,然后用printk打印出来,然后我用dmesg查看到此动态分配的设备号后,在mknod时,采用此自动分配的设备号,

但是好像这样不对,有谁能解释吗?

后面用显示指定的设备号就解决了:

dev_num = MKDEV(major_num, minor_num);
result = register_chrdev_region(dev_num, 1, "gnttab-dev");

论坛徽章:
0
9 [报告]
发表于 2009-07-07 12:49 |只看该作者
自动分配之后这个设备号释放没有?~

没释放的话手动mknod是挂载不到这个指定的设备号的吧~

有兴趣LZ也可以看看这个,大概分析了一下如何使用主次设备号连接字符设备驱动程序的

http://blog.chinaunix.net/u1/57901/showart_1798359.html

论坛徽章:
0
10 [报告]
发表于 2009-07-07 14:53 |只看该作者

楼主.

动态分配设备号是不应该有问题的。如果还有问题,你应该找到真正的问题。
这样才能在调试中顿悟。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP