最近在核心驅動程式程式設計過程中,發現read函式第一次讀出結果後,之後讀就陷入了阻塞。百思不得其解,嘗試更種方法填坑,還是沒解決辦法。後來深入了解read函式,參考網路大神對read函式的理解,才成功填坑。
先看read函式原型:linux/fs.h file_operations結構體
ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
struct file * :是被讀檔案的描述符;
char __user * :為對應放置資訊的緩衝區(即使用者空間記憶體位址);
size _t :為要讀取的首席資訊官度;
loff_t * :為讀的位置相對於檔案開頭的偏移,在讀取資訊後,這個指標一般都會移動,移動的值為要讀取資訊的長度值。
最為重要的是返回值:返回值為實際讀到的位元組數。如果返回0,表示已到達檔案尾或是已無可讀的資料。
注意:read時fd中的資料如果小於要讀取的資料,就會引起阻塞。
加粗部分就是我報錯的原因,因為read函式每一次讀取我都把返回值寫成0了。造成第二次讀取沒有資料刻度,引起阻塞。
Linux程式設計 read函式 write函式
目錄 read函式 write函式 典型應用案例 include ssize t read int fd,void buf,size t count size t fread void ptr,size t size,size t nmemb,file stream fd buf count 讀操作...
C語言read函式的那些坑
今天在複習unix檔案系統,用到那個read函式,但是無意中卻掉到乙個坑里了,用了乙個多小時才找到問題根源,這裡記錄一下。問題是這樣的 我需要使用read和write函式把鍵盤輸入的資訊複製到輸出。所以我寫了如下程式 include define maxsize 10 int main void 輸...
網路程式設計中read函式和write函式使用規範
位元組流套接字上的read和write函式所表現的行為不同於通常的檔案io。位元組流套接字上呼叫read和write輸入或輸出的位元組數可能比請求的數量少,因為核心中用於套接字的緩衝區是有限制的,需要呼叫者多次呼叫read或write函式。從描述符fd中讀取n個位元組,存入vptr指標的位置。思路如...