Chinaunix

标题: 关于字符串的长度问题 [打印本页]

作者: yyykkk1229    时间: 2008-08-20 15:03
标题: 关于字符串的长度问题
char kbuf[1024] = "hello world";
static ssize_t read_test(struct file *file,char *outbuf,size_t count,loff_t *f_pos)
{
if(verify_area(VERIFY_WRITE,outbuf,count)==-EFAULT)
return -EFAULT;
count = strlen(kbuf);   
...}

我想计算出"hello world"的长度,在read中,请问那样写是否正确,我后面进行运行时出错了,我想知道是不是在count上的付值发生错误,谢谢!!!
作者: dreamice    时间: 2008-08-20 15:17
标题: 回复 #1 yyykkk1229 的帖子
count = strlen(kbuf);  -----你能确定kbuf里面是字符串?如果可以,那這樣就没问题,否则,就会出错。
作者: yyykkk1229    时间: 2008-08-20 15:39
char kbuf[1024] = "hello world";
这样定义了一个呀...
   31     count = strlen(kbuf);
     33     if(verify_area(VERIFY_WRITE,outbuf,count)==-EFAULT)
     34         return -EFAULT;
     36         if(count > 10);
     37             count = 10;
     38         Message_Ptr = kbuf;
     39         while((*Message_Ptr) != '\0')
     40         {
     43             if(put_user(*Message_Ptr,outbuf))
     44                     return -EINVAL;
     45                 Message_Ptr++;
     46                 outbuf++;
     48                 bytes_read++;
     49         }
     53         put_user('\0' ,outbuf);
     54         bytes_read++;
测试程序读出的count值是个错误,我不太理解诶,为什么会传送不成功呢,count值本身不是就在read函数里面的吗
作者: yyykkk1229    时间: 2008-08-20 15:47
我的意思是本身定义了一个字符串,假设为hello world,但是我读取空间只分配了10个字节,并不能把全部的读出来,我用count做个界限,只读10字节长度的东西
作者: happy_fish100    时间: 2008-08-20 15:50
标题: 回复 #3 yyykkk1229 的帖子
有没有打印count的值呢?
如果使用C,
char kbuf[1024] = "hello world";
这样赋值有点问题。
最好改用strcpy来拷贝字符串。
char kbuf[1024];
strcpy(kbuf, "hello world");
作者: yyykkk1229    时间: 2008-08-20 16:00
标题: 回复 #5 happy_fish100 的帖子
打印count的值是1073792680
按照楼上的那种定义结果是一样的,感觉错误是在read函数中,并没有将count的值成功的转移到测试程序中
作者: web_surf    时间: 2008-08-20 16:23
标题: 回复 #1 yyykkk1229 的帖子
在count = strlen(kbuf);之后立即打印count看看,估记是越界了,内核中的栈跟应用程序不一样,它大大小是固定的,一般为4K或8K。

建议不要在栈中分配如此大大buf.
作者: yyykkk1229    时间: 2008-08-20 16:31
标题: 回复 #7 web_surf 的帖子
count = strlen(kbuf);之后立即打印count出的值是11
但从设备程序传到测试程序时, count的值便不在是11了,出现错误
put_user这个函数里的参数是没有count的,我不太理解这个传送count发生了些什么
作者: web_surf    时间: 2008-08-20 16:37
标题: 回复 #8 yyykkk1229 的帖子
>>>打印count的值是1073792680
这个是哪里打印的?
作者: web_surf    时间: 2008-08-20 16:43
标题: 回复 #1 yyykkk1229 的帖子
看出来了,你是在应用程序中打印的吧? 函数参数的传递方式你应该知道,当函数参数是传值时,你在函数体中对形参所做对修改不会影响到实参。何不直接 return count;呢
作者: yyykkk1229    时间: 2008-08-20 16:47
标题: 回复 #10 web_surf 的帖子
非常感谢您的答复,我是这样处理的 while(((*Message_Ptr) != '\0')&&(bytes_read < count)),我加上这么一句,因为我在测试程序中字符串的大小是能确定的,通过判断bytes_read的值来跳出循环,不考虑测试程序中count了...
作者: yyykkk1229    时间: 2008-08-20 16:48
麻烦帮忙看下我这种做法是否正确,有什么缺陷,我只是追求把功能实现了
作者: web_surf    时间: 2008-08-20 16:57
标题: 回复 #12 yyykkk1229 的帖子
你到底要实现什么功能,你现在到问题是什么,可以说清楚一点吗?
作者: yyykkk1229    时间: 2008-08-20 17:07
标题: 回复 #13 web_surf 的帖子
设备程序和应用程序之间的连接
我在应用程序中定义了一个字符串,假设只有10个字节,我想把设备程序中的字符串read到应用程序中,由于应用程序的字符串只有10个字节,我想在设备程序中的read函数里加一个界限,当设备程序里的字符串>10时,只传递10个字符,当<10时,能够完整的传递,我的问题是,如何在read函数中加上类似界限的一个东西
我是新手,表达的不太好,麻烦包容下,谢谢
作者: web_surf    时间: 2008-08-20 17:12
标题: 回复 #14 yyykkk1229 的帖子
char *kbuf = "hello world";

static ssize_t read_test(struct file *file,char *outbuf,size_t count,loff_t *f_pos)
{
    int real_count;
    int kbuf_count;

    if(verify_area(VERIFY_WRITE,outbuf,count)==-EFAULT)
        return -EFAULT;
   
    kbuf_count = strlen(kbuf);
    real_count = kbuf_count < count ? kbuf_count : count;

    copy_to_user(outbuf, kbuf, real_count);  
   
    return real_count;
}
作者: yyykkk1229    时间: 2008-08-20 17:22
标题: 回复 #15 web_surf 的帖子
非常感谢,那我在应用程序的read(testdev, outbuf, ???),???这个地方应该填写什么呢?
作者: web_surf    时间: 2008-08-20 17:25
标题: 回复 #16 yyykkk1229 的帖子
returned_len = read(testdev, outbuf, outbuf_len);
作者: yyykkk1229    时间: 2008-08-20 17:31
感谢感谢感谢感谢感谢感谢感谢
作者: mouse2000    时间: 2008-08-20 21:58
原帖由 happy_fish100 于 2008-8-20 15:50 发表
如果使用C,
char kbuf[1024] = "hello world";
这样赋值有点问题。
最好改用strcpy来拷贝字符串。



这样赋值有问题吗???




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2