1. 程式人生 > >linux核心——建立自己的/proc檔案——processinfo

linux核心——建立自己的/proc檔案——processinfo

利用proc_mkdir()建立一個mydir,再利用create_proc_read_entry()函式建立一個processinfo檔案。我們從模組裡面獲取的資訊都將寫入到processinfo檔案中。

 

有幾個地方不太明白的地方:

1.proc_read_processinfo(char *page, char **start, off_t offset,int count, int *eof, void *data) 幾個引數的含義分別是什麼。以及呼叫的時候系統會傳過來什麼

2.原文中是用list_for_each_entry巨集遍歷程序列表的。但是我編譯會出錯。於是改成了for_each_process.

附:函式原型

1、建立目錄

struct proc_dir_entry *proc_mkdir(const char *name, struct proc_dir_entry *parent);

類似於mkdir()函式,name是目錄名,如“example_dir”,parent是要建立的目錄的父目錄名(若parent = NULL則建立在/proc目錄下)。

2.建立proc檔案:

struct proc_dir_entry *create_proc_entry( const char *name,  mode_t mode, struct proc_dir_entry *parent );

create_proc_entry函式用於建立一個一般的proc檔案,其中name是檔名,比如“hello”,mode是檔案模式,parent是要建立的proc檔案的父目錄(若parent = NULL則建立在/proc目錄下)。

3.刪除proc檔案/目錄:

void remove_dir_entry(const char *name, struct proc_dir_entry *parent);

引數同proc_mkdir()函式類似

4.建立可讀寫的proc檔案

proc檔案實際上是一個叫做proc_dir entry的struct(定義在proc_fs.h),該struct中有int read_proc和int write_proc兩個元素,要實現proc的檔案的讀寫就要給這兩個元素賦值。但這裡不是簡單地將一個整數賦值過去就行了,需要實現兩個回撥函式。

讀回撥函式原型:int mod_read( char *page, char **start, off_t off, int count, int *eof, void *data );

在使用者或應用程式訪問該proc檔案時,就會呼叫這個函式,實現這個函式時只需將想要讓使用者看到的內容放入page即可。

寫回調函式原型:int mod_write( struct file *filp, const char __user *buff, unsigned long len, void *data );

在使用者或應用程式試圖寫入該proc檔案時,就會呼叫這個函式,實現這個函式時需要接收使用者寫入的資料(buff引數)。

5. 建立proc檔案時賦給它mod_read函式。

struct proc_dir_entry *create_proc_read_entry(const char *name, mode_t mode, struct proc_dir_entry *base, read_proc_t * proc_read, void * data)

name : 要建立的檔名;
mode : 檔案掩碼,為 0 則按照系統預設的掩碼建立檔案。
base : 指定該檔案所在的目錄,如果為 NULL,則檔案被建立在 /proc 根目錄下。
read_proc : 實現該檔案的 read_proc 函式。也就是說,當我們讀取 "name" 這個檔案時(如 cat /proc/myproc_name) ,讀取請求會通過這個函式傳送到驅動模組,然後在函式裡處理的資料會寫到 myproc_name 檔案中。
data : 核心忽略此引數,但會把它當作引數傳遞給 read_proc 這個自定義函式。

6.  for_each_process 和list_for_each_entry見下篇日誌