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

  免費注冊 查看新帖 |

Chinaunix

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

請教:cat讀取字符設(shè)備文件 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2009-04-17 12:10 |只看該作者 |倒序瀏覽
10可用積分
我寫了一個module,掛載了一個字符設(shè)備驅(qū)動,使用write系統(tǒng)調(diào)用向內(nèi)核模塊傳遞數(shù)據(jù)。
現(xiàn)在使用cat讀取例如/dev/dev_spring0,把內(nèi)核模塊參數(shù)讀出來,但是讀不到任何內(nèi)容,而在內(nèi)核模塊中注冊的read函數(shù)卻顯示count等于4096,說明cat起作用了。
這是內(nèi)核模塊注冊的函數(shù),應(yīng)該是被調(diào)用過的。

static ssize_t dummy_read(struct file *filp, char *bp, size_t count, loff_t *ppos)
{
        const char* msg = "hello,world\n";
       
        memcpy((void*)bp,(const void*)msg, strlen(msg));

}

我記得cat讀取proc文件系統(tǒng)是沒有問題的。
現(xiàn)在的問題是cat讀取字符設(shè)備,為什么顯示不出內(nèi)容?
另外寫了個C程序打開/dev/dev_spring,打開讀取成功。
怎么樣可以使用cat也能成功讀取顯示內(nèi)容?
請大俠幫幫忙

[ 本帖最后由 springtty 于 2009-4-17 12:18 編輯 ]

最佳答案

查看完整內(nèi)容

cat為了保證文件被讀完,不會像你的例子程序那樣只read一次,而是循環(huán)read,直到EOF(read返回0)。但是你的內(nèi)核模塊并沒有處理EOF,所以不知道這個時候cat干什么去了。你用strace看看cat都在干些什么吧……(strace cat /dev/???)或許你需要在dummy_read中把對于EOF的處理添加進去吧。read的ppos表示本次讀操作的起始位置。copy_to_user之前判斷一下*ppos是否超過了文件長度(strlen(msg)),超過則返回0。然后copy_to_user之后 ...

論壇徽章:
0
2 [報告]
發(fā)表于 2009-04-17 12:10 |只看該作者

回復(fù) #4 springtty 的帖子

cat為了保證文件被讀完,不會像你的例子程序那樣只read一次,而是循環(huán)read,直到EOF(read返回0)。
但是你的內(nèi)核模塊并沒有處理EOF,所以不知道這個時候cat干什么去了。你用strace看看cat都在干些什么吧……(strace cat /dev/???)

或許你需要在dummy_read中把對于EOF的處理添加進去吧。read的ppos表示本次讀操作的起始位置。copy_to_user之前判斷一下*ppos是否超過了文件長度(strlen(msg)),超過則返回0。然后copy_to_user之后更新*ppos的值(返回了幾個字節(jié),pos值就增加幾).

論壇徽章:
0
3 [報告]
發(fā)表于 2009-04-18 12:49 |只看該作者
自己個給自己頂一下

論壇徽章:
0
4 [報告]
發(fā)表于 2009-04-18 19:18 |只看該作者
copy_to_user

論壇徽章:
0
5 [報告]
發(fā)表于 2009-04-18 23:13 |只看該作者
原帖由 kf701 于 2009-4-18 19:18 發(fā)表
copy_to_user

使用copy_to_user也不能使用cat讀取內(nèi)容,但是都可以用下面的程序讀出來

userspace1.jpg (26.22 KB, 下載次數(shù): 41)

用戶態(tài)程序

用戶態(tài)程序

kernelspace.jpg (77.47 KB, 下載次數(shù): 41)

內(nèi)核態(tài)注冊的read函數(shù)

內(nèi)核態(tài)注冊的read函數(shù)

論壇徽章:
0
6 [報告]
發(fā)表于 2009-04-19 17:09 |只看該作者
原帖由 kouu 于 2009-4-17 12:10 發(fā)表
cat為了保證文件被讀完,不會像你的例子程序那樣只read一次,而是循環(huán)read,直到EOF(read返回0)。
但是你的內(nèi)核模塊并沒有處理EOF,所以不知道這個時候cat干什么去了。你用strace看看cat都在干些什么吧……( ...


原來如此,返回0表示讀到了EOF,返回正數(shù)表示讀了多少,cat還會繼續(xù)讀,那我只讓它讀一次,再讀的時候返回0即可。
多謝,高手哈
您需要登錄后才可以回帖 登錄 | 注冊

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

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP