请教个问题,高手帮忙下,谢谢

发布于 2022-09-20 13:58:06 字数 1937 浏览 32 评论 0

static ssize_t read_test(struct file *file,char *outbuf,size_t count,loff_t *f_pos)
{
        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;
                                count--;
                                bytes_read++;
                }
                memset(kbuf,0,sizeof(kbuf));
                return bytes_read;
}
里面的函数在开始已经全部定义过,wirte只是简单的copy_from_user(kbuf,outbuf,count);下面是问题,①测试时什么都不输入时,希望read有个初始值,假设为hello,world,希望能够输出hello,world,再次运行测试函数,输入字符串,显示字符串的内容和长度(这个上面的做的出来,不能算是问题),②当再次不输入时,显示出上次输入时的字符串.
请问程序改如何改呀,谢谢!!!!!!

[ 本帖最后由 yyykkk1229 于 2008-8-14 12:15 编辑 ]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

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

发布评论

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

评论(9

橘寄 2022-09-27 13:58:06

memset(kbuf,0,sizeof(kbuf));这一句在write函数真正写之前做,这样读的时候就不用清kbuf了,而是在写之前清,这样做显得更合理一些。

友谊不毕业 2022-09-27 13:58:06

放在write前面也不行呀,问题②没办法解决,我输入过一次后显示出字符串.下一次测试不输入的时候kbuf里的东西也被清空,并不能显示上一次的数据.把memset这句去掉后,又出现昨天的问题,当输入长过上一次字符串的时候没有问题,短于上次字符串时.后面的部分被保留///并不是全部刷新的

<逆流佳人身旁 2022-09-27 13:58:06

我的意思是,read里面的memset去掉,在write里面,写之前,memset一下,就可以了。

念﹏祤嫣 2022-09-27 13:58:06

我理解楼上的意思了...我也是那样做的呀...

雨后彩虹 2022-09-27 13:58:06

全局定义:char kbuf[] = "hello world";
static ssize_t read_test(struct file *file,char *outbuf,size_t count,loff_t *f_pos)
{
        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++)) //最好别这么写,函数调用有时候会出问题
                 if(put_user(*(Message_Ptr),outbuf))
                                        return -EINVAL;
                                Message_Ptr++;
                                outbuf++;
                                count--;
                                bytes_read++;
                }
                return bytes_read;
}

static ssize_t write_test(struct file *file,const char *outbuf,size_t count,loff_t *f_pos)
{
        memset(kbuf, 0, sizeof(kbuf));
        copy_from_user(kbuf,outbuf,count);
        return count;
}

旧时光的容颜 2022-09-27 13:58:06

首先非常感谢楼上那位兄弟的耐心,但我按照你的程序如实编写,依然出现如上2个问题,我把我写的测试函数贴出来,麻烦看下是否有误
{...
     printf("input string:");
        scanf("%[^\n]",&outbuf);
        printf("A:%s\n", outbuf);
        count=strlen(outbuf);
        printf("%d\n",count);
        write(testdev,outbuf,count);
        memset(outbuf, 0, sizeof(outbuf));
        n = read(testdev,outbuf,4096);
        printf("read len=%d\n", n);
        printf("%s\n",outbuf);
        close(testdev);
        return 0;
}步骤不会错的,编译完后重新加载,然后测试...
[root@localhost char]# ./a.out
input string:
A:
0
read len=0

[root@localhost char]# ./a.out
input string:hello
A:hello
5
read len=5
hello
[root@localhost char]# ./a.out
input string:
A:
0
read len=0

第一步我想在没有输入的情况下,显示hello world
第三步我想在没有输入的情况下,显示上一步输入的东西hello
请问该如何修改,谢谢了~

傲娇萝莉攻 2022-09-27 13:58:06

第一步这样解决:
static ssize_t write_test(struct file *file,const char *outbuf,size_t count,loff_t *f_pos)
{
        if (count == 0)
              return 0;
        memset(kbuf, 0, sizeof(kbuf));
        copy_from_user(kbuf,outbuf,count);
        return count;
}
第三步的问题,我觉得你这个没有多大意义,首先,你测试程序既要写又要读,如果不写,就保持原来的数据吧,如果写了,就清空原来的数据,写入新的数据,这是一种逻辑关系;至于读的话,这是另一个逻辑了,他只关心内核中kbuf的数据,并不关心你写没有。完全不同的两个概念,所以,你要实现第三不没有多大意义。如果你想实现,可以改你的测试程序的逻辑。

在巴黎塔顶看东京樱花 2022-09-27 13:58:06

OK ,非常感谢!!!
老师布置的任务,让我实现这些功能,没办法呀,呵呵
慢慢深入学习,接触LINUX快一个月了,感觉进度慢了些,主要自己读程序写程序的功底不行
谢谢呀~

如果没有 2022-09-27 13:58:06

对了,忘了说了,你加了2行程序,第2个问题也解决了,呵呵~

[ 本帖最后由 yyykkk1229 于 2008-8-14 14:53 编辑 ]

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