继续请教

发布于 2022-09-21 00:49:55 字数 2982 浏览 19 评论 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

高跟鞋的旋律 2022-09-28 00:49:55

我给你注解一下吧:
老师在我的测试程序中加了一段程序
        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 编辑 ]

梦里人 2022-09-28 00:49:55

我明白了,那请问该怎么修改read那个函数在'\0'的时候就返回,不输入后面加载的字符

落在眉间の轻吻 2022-09-28 00:49:55

老师在我的测试程序中加了一段程序
     memset(outbuf, 0x32, sizeof(outbuf));
        n = read(testdev,outbuf,4096);
        outbuf[n] = '\0';
        printf("read len=%d\n", n);
        printf("read: %s\n",outbuf);

遇到问题自己多思考一下吧。这是个很基础的问题。

蓦然回首 2022-09-28 00:49:55

这个地方,对是否读取错误也没有做检查。写程序思维要严谨一些。

醉殇 2022-09-28 00:49:55

谢谢楼上的,我的意思是如何修改read这个函数,在read里面进行返回'\0',这应该算是一个优化问题吧,在测试程序中进行修改,在原程序中还是需要读取4000多了字符,只是在测试中屏蔽掉了,,系统依然运行了...

清眉祭 2022-09-28 00:49:55

你仔细分析一下这个程序的执行,或者你可以看一下read函数的manual 手册,read在什么时候返回?阻塞与非阻塞是怎么实现的?自己分析搞明白这些理解就深刻了。我建议你再仔细研读一下LDD,同时,要搞驱动程序,没有一定的应用程序功底,也是不行的。

淡忘如思 2022-09-28 00:49:55

我感觉应该在read里面,用count计算字符串的长度,当出现'\0'时跳出while循环,但是不知道该如何写这个过程

朱染 2022-09-28 00:49:55

OK...谢谢...

青柠芒果 2022-09-28 00:49:55

原帖由 yyykkk1229 于 2008-8-18 12:52 发表
谢谢楼上的,我的意思是如何修改read这个函数,在read里面进行返回'\0',这应该算是一个优化问题吧,在测试程序中进行修改,在原程序中还是需要读取4000多了字符,只是在测试中屏蔽掉了,,系统依然运行了...

写驱动程序,首先要弄明白机制与策略这两个概念及思想。可以说,你这样的想法先不说他正确与否,这是一个策略问题,不应该是驱动程序应该去关心的,这样就犯了一个写驱动程序的错误;另外,你请求读4096字节,难道read真的会返回这么多数据?要知道outbuf是你用户空间的东东,而读取的数据是内核空间的,先看看系统调用read的实现吧,看read manual的帮助。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文