※ read和write
ssize_t read(struct file *filp, char _ _user *buff,size_t count, loff_t *offp);
從設備拷貝數據到用戶空間
ssize_t write(struct file *filp, const char _ _user *buff,size_t count,
loff_t *offp);
從用戶空間拷貝數據到設備上。
※ 參數buff是指向用戶空間的緩沖區,這個緩沖區或者保存要寫入的數據,或者是一個存放新讀入數據的空緩沖區。
unsigned long copy_to_user(void _ _user *to, const void *from,
unsigned long count);
unsigned long copy_from_user(void *to, const void _ _user *from,
unsigned long count);
※ 這兩個函數還檢測用戶空間的指針是否有效。
※ Read方法
n 如果返回值等于最為count參數傳遞給read系統調用的值,所請求的字節數傳輸就成功完成了。這是最好的情況。
n 如果返回值是正的,但是比count小,只有部分數據成功傳送。這種情況因設備的不同可能有許多原因。大部分情況下,程序會重新讀數據。例如,如果你用fread函數讀數據,這個庫庫函數會不斷調用系統調用直至所請求的數據傳輸完成。
n 如果返回值為0,它表示已經到達了文件尾。
n 負值意味著發生了錯誤。值就是錯誤編碼,錯誤編碼在<linux/errno.h>中定義。
※ 與read相似,根據如下返回值規則,write也可以傳輸少于請求的數據量:
n 如果返回值等于count,則完成了請求數目的字節傳送。
n 如果返回值是正的,但小于count,只傳輸了部分數據。再說明一次,程序很可能會再次讀取余下的部分。
n 如果值為0,什么也沒寫。這個結果不是錯誤,而且也沒有什么緣由需要返回一個錯誤編碼。再說明一次,標準庫會重復調用write。以后的章節會介紹阻塞型write,我們會對這種情形最更詳盡的考察。
n 負值意味發生了錯誤;語義與read相同。