继续请教
unsigned char kbuf[1024]="hello world!\n";
static ssize_t read_test(struct file *file,char *outbuf,size_t count,loff_t *f_pos)
{
//int left;
printk(KERN_ALERT "read1\n");
int bytes_read=0;
if(verify_area(VERIFY_WRITE,outbuf,count)==-EFAULT)
return -EFAULT;
Message_Ptr=kbuf;
while(count && *Message_Ptr)
{
if(put_user(*(Message_Ptr),outbuf))
return -EINVAL;
Message_Ptr++;
outbuf++;
count--;
bytes_read++;
}
return bytes_read;
}
老师在我的测试程序中加了一段程序
memset(outbuf, 0x32, sizeof(outbuf));
n = read(testdev,outbuf,4096);
printf("read len=%d\n", n);
printf("read: %s\n",outbuf);
说这是在初始读取的outbuf的数值
输出为read len=12
read: hello world!
222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222....
我定义的outbuf是4096个字节,输出的字符串应该是4096个字节
memset(outbuf, 0, sizeof(outbuf));
n = read(testdev,outbuf,4096);
printf("read len=%d\n", n);
printf("%s\n",outbuf);
我这样输入的就是正常的hello world!
这是什么原因啊~
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
我给你注解一下吧:
老师在我的测试程序中加了一段程序
memset(outbuf, 0x32, sizeof(outbuf)); /* 把outbuf初始化为字符‘2’ */
n = read(testdev,outbuf,4096); /* 这里读出来的是hello world, 但是4096的outbuf其余部分全部为字符‘2’填充, 所以下面的结果不言而喻 */
printf("read len=%d\n", n);
printf("read: %s\n",outbuf); /* 问题出在这里,一个基本概念:%s输出是什么格式?答曰:字符串;字符串以什么结尾? 答曰:‘\0’or 0 你这样输出为什么会有问题? --输出的格式是字符串,而outbuf确实是字符串么?*/
说这是在初始读取的outbuf的数值
输出为read len=12
read: hello world!
222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222....
我定义的outbuf是4096个字节,输出的字符串应该是4096个字节
memset(outbuf, 0, sizeof(outbuf));
n = read(testdev,outbuf,4096);
printf("read len=%d\n", n);
printf("%s\n",outbuf); /* 这里为什么能对,看上面的注解吧 */
我这样输入的就是正常的hello world!
这是什么原因啊~
[ 本帖最后由 dreamice 于 2008-8-18 12:21 编辑 ]
我明白了,那请问该怎么修改read那个函数在'\0'的时候就返回,不输入后面加载的字符
老师在我的测试程序中加了一段程序
memset(outbuf, 0x32, sizeof(outbuf));
n = read(testdev,outbuf,4096);
outbuf[n] = '\0';
printf("read len=%d\n", n);
printf("read: %s\n",outbuf);
遇到问题自己多思考一下吧。这是个很基础的问题。
这个地方,对是否读取错误也没有做检查。写程序思维要严谨一些。
谢谢楼上的,我的意思是如何修改read这个函数,在read里面进行返回'\0',这应该算是一个优化问题吧,在测试程序中进行修改,在原程序中还是需要读取4000多了字符,只是在测试中屏蔽掉了,,系统依然运行了...
你仔细分析一下这个程序的执行,或者你可以看一下read函数的manual 手册,read在什么时候返回?阻塞与非阻塞是怎么实现的?自己分析搞明白这些理解就深刻了。我建议你再仔细研读一下LDD,同时,要搞驱动程序,没有一定的应用程序功底,也是不行的。
我感觉应该在read里面,用count计算字符串的长度,当出现'\0'时跳出while循环,但是不知道该如何写这个过程
OK...谢谢...
写驱动程序,首先要弄明白机制与策略这两个概念及思想。可以说,你这样的想法先不说他正确与否,这是一个策略问题,不应该是驱动程序应该去关心的,这样就犯了一个写驱动程序的错误;另外,你请求读4096字节,难道read真的会返回这么多数据?要知道outbuf是你用户空间的东东,而读取的数据是内核空间的,先看看系统调用read的实现吧,看read manual的帮助。