免费注册 查看新帖 |

Chinaunix

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

请教:cat读取字符设备文件 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-17 12:10 |只看该作者 |倒序浏览
10可用积分
我写了一个module,挂载了一个字符设备驱动,使用write系统调用向内核模块传递数据。
现在使用cat读取例如/dev/dev_spring0,把内核模块参数读出来,但是读不到任何内容,而在内核模块中注册的read函数却显示count等于4096,说明cat起作用了。
这是内核模块注册的函数,应该是被调用过的。

static ssize_t dummy_read(struct file *filp, char *bp, size_t count, loff_t *ppos)
{
        const char* msg = "hello,world\n";
       
        memcpy((void*)bp,(const void*)msg, strlen(msg));

}

我记得cat读取proc文件系统是没有问题的。
现在的问题是cat读取字符设备,为什么显示不出内容?
另外写了个C程序打开/dev/dev_spring,打开读取成功。
怎么样可以使用cat也能成功读取显示内容?
请大侠帮帮忙

[ 本帖最后由 springtty 于 2009-4-17 12:18 编辑 ]

最佳答案

查看完整内容

cat为了保证文件被读完,不会像你的例子程序那样只read一次,而是循环read,直到EOF(read返回0)。但是你的内核模块并没有处理EOF,所以不知道这个时候cat干什么去了。你用strace看看cat都在干些什么吧……(strace cat /dev/???)或许你需要在dummy_read中把对于EOF的处理添加进去吧。read的ppos表示本次读操作的起始位置。copy_to_user之前判断一下*ppos是否超过了文件长度(strlen(msg)),超过则返回0。然后copy_to_user之后 ...

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

回复 #4 springtty 的帖子

cat为了保证文件被读完,不会像你的例子程序那样只read一次,而是循环read,直到EOF(read返回0)。
但是你的内核模块并没有处理EOF,所以不知道这个时候cat干什么去了。你用strace看看cat都在干些什么吧……(strace cat /dev/???)

或许你需要在dummy_read中把对于EOF的处理添加进去吧。read的ppos表示本次读操作的起始位置。copy_to_user之前判断一下*ppos是否超过了文件长度(strlen(msg)),超过则返回0。然后copy_to_user之后更新*ppos的值(返回了几个字节,pos值就增加几).

论坛徽章:
0
3 [报告]
发表于 2009-04-18 12:49 |只看该作者
自己个给自己顶一下

论坛徽章:
0
4 [报告]
发表于 2009-04-18 19:18 |只看该作者
copy_to_user

论坛徽章:
0
5 [报告]
发表于 2009-04-18 23:13 |只看该作者
原帖由 kf701 于 2009-4-18 19:18 发表
copy_to_user

使用copy_to_user也不能使用cat读取内容,但是都可以用下面的程序读出来

userspace1.jpg (26.22 KB, 下载次数: 35)

用户态程序

用户态程序

kernelspace.jpg (77.47 KB, 下载次数: 34)

内核态注册的read函数

内核态注册的read函数

论坛徽章:
0
6 [报告]
发表于 2009-04-19 17:09 |只看该作者
原帖由 kouu 于 2009-4-17 12:10 发表
cat为了保证文件被读完,不会像你的例子程序那样只read一次,而是循环read,直到EOF(read返回0)。
但是你的内核模块并没有处理EOF,所以不知道这个时候cat干什么去了。你用strace看看cat都在干些什么吧……( ...


原来如此,返回0表示读到了EOF,返回正数表示读了多少,cat还会继续读,那我只让它读一次,再读的时候返回0即可。
多谢,高手哈
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP