免费注册 查看新帖 |

Chinaunix

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

请教个问题,高手帮忙下,谢谢 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-14 12:13 |只看该作者 |倒序浏览
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 编辑 ]

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
2 [报告]
发表于 2008-08-14 12:23 |只看该作者

回复 #1 yyykkk1229 的帖子

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

论坛徽章:
0
3 [报告]
发表于 2008-08-14 12:57 |只看该作者
放在write前面也不行呀,问题②没办法解决,我输入过一次后显示出字符串.下一次测试不输入的时候kbuf里的东西也被清空,并不能显示上一次的数据.把memset这句去掉后,又出现昨天的问题,当输入长过上一次字符串的时候没有问题,短于上次字符串时.后面的部分被保留///并不是全部刷新的

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
4 [报告]
发表于 2008-08-14 13:23 |只看该作者

回复 #3 yyykkk1229 的帖子

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

论坛徽章:
0
5 [报告]
发表于 2008-08-14 13:26 |只看该作者
我理解楼上的意思了...我也是那样做的呀...

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
6 [报告]
发表于 2008-08-14 13:46 |只看该作者
全局定义: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;
}

论坛徽章:
0
7 [报告]
发表于 2008-08-14 14:02 |只看该作者
首先非常感谢楼上那位兄弟的耐心,但我按照你的程序如实编写,依然出现如上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
请问该如何修改,谢谢了~

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
8 [报告]
发表于 2008-08-14 14:38 |只看该作者

回复 #7 yyykkk1229 的帖子

第一步这样解决:
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的数据,并不关心你写没有。完全不同的两个概念,所以,你要实现第三不没有多大意义。如果你想实现,可以改你的测试程序的逻辑。

论坛徽章:
0
9 [报告]
发表于 2008-08-14 14:46 |只看该作者
OK ,非常感谢!!!
老师布置的任务,让我实现这些功能,没办法呀,呵呵
慢慢深入学习,接触LINUX快一个月了,感觉进度慢了些,主要自己读程序写程序的功底不行
谢谢呀~

论坛徽章:
0
10 [报告]
发表于 2008-08-14 14:47 |只看该作者
对了,忘了说了,你加了2行程序,第2个问题也解决了,呵呵~

[ 本帖最后由 yyykkk1229 于 2008-8-14 14:53 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP