前邊說過目錄項建立時一般都使用預設的讀寫函式,本節就來看看預設的檔案操作函式的定義。前邊已經引用過該定義,此處再次引用:
static const struct file_operations proc_file_operations = ;
proc_file_read的實現
從proc檔案中讀取資料需要經歷三個步驟
1.申請記憶體頁用於儲存資料
2.呼叫檔案相關的函式填充步驟1申請的記憶體頁
3.把資料從核心空間拷貝到使用者空間
很明顯,步驟2至關重要,因為這一步正是準備資料。在二.proc資料結構一節我們已經注意到struct proc_dir_entry中提供了兩個用於讀取資料的函式指標,get_info和read_proc,在proc_file_read中就需要根據不同情況選取二者其一。閒言少敘,上**說話。一如既往,**是經過簡化的。
static ssize_t proc_file_read(struct file *file, char __user *buf,
size_t nbytes, loff_t *ppos)
else if (dp->read_proc) else
break;
。。。//步驟3,將資料從核心空間拷貝到使用者空間
n -= copy_to_user(buf, start < page ? page : start, n);
。。。}
free_page((unsigned long) page);
return retval;
} 這裡有乙個函式需要說明一下,看**中紅色部分
dp = pde(inode) ;這個pde函式的實現如下:
static inline struct proc_dir_entry *pde(const struct inode *inode)
這個proc_i函式是不是很熟悉?呵呵,不錯,這不正是第二節中使用container機制獲取proc_inode結構使用的那個函式麼?現在該明白上邊介紹那個函式的用途了吧。
這種閹割後的**便於理解程式的大致流程,但是省略了很多邊界檢查,如果需要,請參考核心源**。
proc_file_write的實現
相比而言proc_file_write的實現相對簡單些,這裡就不再解釋了,直接上**,明白了proc_file_read函式,這個應該很容易就能讀懂。
static ssize_t proc_file_write(struct file *file, const char __user *buffer,size_t count, loff_t *ppos)
proc_file_lseek實現
這個函式的實現就直接在**中注釋了
static loff_t proc_file_lseek(struct file *file, loff_t offset, int orig)
return retval;
} 到此為止,proc的管理函式就分析完畢了,核心原始碼中有乙個例子documentation/docbook/procfs_example.c,就是為了說明這節分析的內容。
proc原始碼解析(六) proc檔案讀寫函式
前邊說過目錄項建立時一般都使用預設的讀寫函式,本節就來看看預設的檔案操作函式的定義。前邊已經引用過該定義,此處再次引用 static const struct file operations proc file operations proc file read的實現 從proc檔案中讀取資料需要經...
proc原始碼解析(三) proc初始化
在使用proc之前,我們必須首先初始化並掛載proc,並在核心記憶體中建立資料結構來描述檔案系統。但是,不同的體系結構擁有不同的proc內容,所以,在初始化階段並不完全建立子目錄的內容,有些檔案要等到系統執行時動態建立。proc檔案系統初始化的流程圖如下 proc root init的定義定義如下 ...
proc原始碼解析(三) proc初始化
在使用proc之前,我們必須首先初始化並掛載proc,並在核心記憶體中建立資料結構來描述檔案系統。但是,不同的體系結構擁有不同的proc內容,所以,在初始化階段並不完全建立子目錄的內容,有些檔案要等到系統執行時動態建立。proc檔案系統初始化的流程圖如下 proc root init的定義定義如下 ...