亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 3947 | 回復: 15
打印 上一主題 下一主題

繼續(xù)請教 [復制鏈接]

論壇徽章:
0
跳轉到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2008-08-18 12:00 |只看該作者 |倒序瀏覽
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的數(shù)值
輸出為read len=12
read: hello world!
222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222....
我定義的outbuf是4096個字節(jié),輸出的字符串應該是4096個字節(jié)
      memset(outbuf, 0, sizeof(outbuf));
        n = read(testdev,outbuf,4096);
        printf("read len=%d\n", n);
        printf("%s\n",outbuf);
我這樣輸入的就是正常的hello world!
這是什么原因啊~

論壇徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辭舊歲徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
2 [報告]
發(fā)表于 2008-08-18 12:20 |只看該作者

回復 #1 yyykkk1229 的帖子

我給你注解一下吧:
老師在我的測試程序中加了一段程序
        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的數(shù)值
輸出為read len=12
read: hello world!
222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222....
我定義的outbuf是4096個字節(jié),輸出的字符串應該是4096個字節(jié)
      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 編輯 ]

論壇徽章:
0
3 [報告]
發(fā)表于 2008-08-18 12:36 |只看該作者
我明白了,那請問該怎么修改read那個函數(shù)在'\0'的時候就返回,不輸入后面加載的字符

論壇徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辭舊歲徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
4 [報告]
發(fā)表于 2008-08-18 12:39 |只看該作者

回復 #3 yyykkk1229 的帖子

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


遇到問題自己多思考一下吧。這是個很基礎的問題。

論壇徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辭舊歲徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
5 [報告]
發(fā)表于 2008-08-18 12:42 |只看該作者

回復 #4 dreamice 的帖子

這個地方,對是否讀取錯誤也沒有做檢查。寫程序思維要嚴謹一些。

論壇徽章:
0
6 [報告]
發(fā)表于 2008-08-18 12:52 |只看該作者
謝謝樓上的,我的意思是如何修改read這個函數(shù),在read里面進行返回'\0',這應該算是一個優(yōu)化問題吧,在測試程序中進行修改,在原程序中還是需要讀取4000多了字符,只是在測試中屏蔽掉了,,系統(tǒng)依然運行了...

論壇徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辭舊歲徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
7 [報告]
發(fā)表于 2008-08-18 13:28 |只看該作者

回復 #6 yyykkk1229 的帖子

你仔細分析一下這個程序的執(zhí)行,或者你可以看一下read函數(shù)的manual 手冊,read在什么時候返回?阻塞與非阻塞是怎么實現(xiàn)的?自己分析搞明白這些理解就深刻了。我建議你再仔細研讀一下LDD,同時,要搞驅動程序,沒有一定的應用程序功底,也是不行的。

論壇徽章:
0
8 [報告]
發(fā)表于 2008-08-18 13:29 |只看該作者
我感覺應該在read里面,用count計算字符串的長度,當出現(xiàn)'\0'時跳出while循環(huán),但是不知道該如何寫這個過程

論壇徽章:
0
9 [報告]
發(fā)表于 2008-08-18 13:30 |只看該作者

回復 #7 dreamice 的帖子

OK...謝謝...

論壇徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辭舊歲徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
10 [報告]
發(fā)表于 2008-08-18 13:38 |只看該作者
原帖由 yyykkk1229 于 2008-8-18 12:52 發(fā)表
謝謝樓上的,我的意思是如何修改read這個函數(shù),在read里面進行返回'\0',這應該算是一個優(yōu)化問題吧,在測試程序中進行修改,在原程序中還是需要讀取4000多了字符,只是在測試中屏蔽掉了,,系統(tǒng)依然運行了...


寫驅動程序,首先要弄明白機制與策略這兩個概念及思想?梢哉f,你這樣的想法先不說他正確與否,這是一個策略問題,不應該是驅動程序應該去關心的,這樣就犯了一個寫驅動程序的錯誤;另外,你請求讀4096字節(jié),難道read真的會返回這么多數(shù)據(jù)?要知道outbuf是你用戶空間的東東,而讀取的數(shù)據(jù)是內核空間的,先看看系統(tǒng)調用read的實現(xiàn)吧,看read manual的幫助。
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉載本站內容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP