免费注册 查看新帖 |

Chinaunix

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

[求助]字符驱动 write返回0 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-09-23 19:53 |只看该作者 |倒序浏览
写个最简单字符驱动,fops 中write函数 直接返回0
写个小程序test.c程序: write(fd,"a",1); 这里测试发现确实返回0
但是用 echo a > char_test (char_test 是mknod出来对应字符驱动的),
之后无限次调用fops->write 导致死机,这个是什么原因呢,看了下 sys_write 和echo的代码 好像没有循环写,难道shell自己重定向后重复写的?

论坛徽章:
0
2 [报告]
发表于 2010-09-24 22:50 |只看该作者
不要去怀疑系统调用以及echo程序... 是你自己写的write有问题...

论坛徽章:
0
3 [报告]
发表于 2010-09-25 09:59 |只看该作者
"不要去怀疑系统调用以及echo程序... 是你自己写的write有问题..."  一针见血.

论坛徽章:
0
4 [报告]
发表于 2010-09-25 14:02 |只看该作者
对的 write是有问题的,write代码就是这个:
ssize_t
cdev_write(struct file *file, const char __user *ubuf,size_t count, loff_t *ppos)
{
           //printk(KERN)ALERT "write\n");
           return 0;
}

但是我问的意思是:为什么 echo a > char_test会无限循环。。。
还是说write就不能返回0 呢?
因为我不把这个搞懂,就不知道何时write可以返回0
希望再赐教下

论坛徽章:
0
5 [报告]
发表于 2010-09-25 15:07 |只看该作者
我不知道echo程序到底是如何实现的...我没有看过echo的源代码..
但是按照我平常调用write系统调用的方式猜测... 你用"echo a > char_test"
这个char_test应该是你用mknod创建的节点吧?   你向这个特殊文件写入一个字符.
在echo程序里应该是需要向char_test中写入一个字符a。而在调用write写入a时,你返回的是0。
表示一个字符都没有写进去.那么应用层可能解释为发生了某种错误.可能是由于中断引起的.如返回
-EINTR错误. 那么echo就再次尝试向这个文件写入这个字符...如此循环...

论坛徽章:
0
6 [报告]
发表于 2010-09-25 16:29 |只看该作者
write要返回写入的实际长度,应用层需要此返回值来做判断

论坛徽章:
0
7 [报告]
发表于 2010-09-25 16:36 |只看该作者
write要返回写入的实际长度,应用层需要此返回值来做判断
ljysyn 发表于 2010-09-25 16:29

我也觉得是这样的 但是这个“应用层” 具体指的是什么呢? shell? echo?
刚刚又仔细看了下GNU coreutils-5.0/src/echo.c ,echo 直接 puts出要输出的内容 并没有检测返回值
我在想是不是shell重定向后会有检测, 难道还要去翻下bash代码= =!

论坛徽章:
0
8 [报告]
发表于 2010-09-25 16:40 |只看该作者
你可以去POSIX看看write系统调用的实现要求...它没有要求具体的实现过程. 但是结果是一样的...
echo程序调用write。其期望的是所有的write的实现的版本结果应当是一样的...而你所写的wirte无论什么情况都返回0.肯定是不对的...除非你自己写的测试程序能够解释这种任何情况下都返回0的write.

论坛徽章:
0
9 [报告]
发表于 2010-09-25 16:48 |只看该作者
回复 8# PCliangtao


    好思路 我去整整 有事再来冒个泡
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP