请教个问题,高手帮忙下,谢谢
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
memset(kbuf,0,sizeof(kbuf));这一句在write函数真正写之前做,这样读的时候就不用清kbuf了,而是在写之前清,这样做显得更合理一些。
放在write前面也不行呀,问题②没办法解决,我输入过一次后显示出字符串.下一次测试不输入的时候kbuf里的东西也被清空,并不能显示上一次的数据.把memset这句去掉后,又出现昨天的问题,当输入长过上一次字符串的时候没有问题,短于上次字符串时.后面的部分被保留///并不是全部刷新的
我的意思是,read里面的memset去掉,在write里面,写之前,memset一下,就可以了。
我理解楼上的意思了...我也是那样做的呀...
全局定义: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;
}
首先非常感谢楼上那位兄弟的耐心,但我按照你的程序如实编写,依然出现如上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
请问该如何修改,谢谢了~
第一步这样解决:
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的数据,并不关心你写没有。完全不同的两个概念,所以,你要实现第三不没有多大意义。如果你想实现,可以改你的测试程序的逻辑。
OK ,非常感谢!!!
老师布置的任务,让我实现这些功能,没办法呀,呵呵
慢慢深入学习,接触LINUX快一个月了,感觉进度慢了些,主要自己读程序写程序的功底不行
谢谢呀~
对了,忘了说了,你加了2行程序,第2个问题也解决了,呵呵~
[ 本帖最后由 yyykkk1229 于 2008-8-14 14:53 编辑 ]