核心 proc fs 使用說明

2021-05-31 22:16:51 字數 3887 閱讀 9082

建立乙個 proc 檔案

根據對 proc 檔案的不同使用,核心提供了多種包裝函式來建立乙個 proc 檔案。

方法一:

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

這是最直接,包裝最少的建立方法。

引數 name 是要建立的 proc 檔名。mode 是該檔案許可權值,例如 s_irugo,可傳入0表示採用系統預設值。parent 指定該檔案的上層 proc 目錄項,如果為 null,表示建立在 /proc 根目錄下。

create_proc_entry() 完成的任務主要包括:檢測 mode 值,分配 proc_dir_entry 結構,註冊 proc_dir_entry。

方法二:

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

return res;

}如果要建立乙個唯讀的 proc 檔案,可以採用 create_proc_read_entry() 這個介面。這個介面其實就是給 proc_dir_entry 多賦了兩個值,其中 read_proc 是乙個函式指標, data 是 read_proc 呼叫時傳給它乙個引數。關於 read_proc 函式,接下來會另行分析。

方法三:

struct proc_dir_entry *proc_create(const char *name, mode_t mode, struct proc_dir_entry *parent, const struct file_operations *proc_fops)

如果要建立乙個 proc 檔案,並且不用 proc_fs 預設提供的 file_operations 的話,可以使用 proc_create() 這個函式,通過最後乙個引數來指定要建立的 proc 檔案的 file_operations。

每個 proc 檔案也都會用到 file_operations,在呼叫 create_proc_entry() 建立 proc 檔案時,其中一步是呼叫 proc_register(),proc_register() 會為 proc_dir_entry 提供乙個預設的 file_operations,而 proc_create() 與 create_proc_entry() 唯一差別就是在呼叫 proc_register() 前先設定好 proc_dir_entry 的 file_operations,這樣在 proc_register() 時就不會設定使用 proc_fs 預設的 file_operations 了。

proc_fs 預設的 file_operations 定義如下:

static const struct file_operations proc_file_operations = ;

關於這個 proc_file_operations,後面會繼續講到。

proc_create() 一般在建立使用 seq_file 介面的 proc 檔案時會使用。

建立乙個 proc 目錄

建立乙個 proc 目錄就呼叫 struct proc_dir_entry *proc_mkdir(const char *name, struct proc_dir_entry *parent) 這個函式。引數name 是目錄名,parent 是該目錄的上層 proc 目錄項,如果為 null,表示建立在 /proc 根目錄下。

刪除乙個 proc 項

要刪除乙個 proc 檔案或目錄就呼叫 void remove_proc_entry(const char *name, struct proc_dir_entry *parent)

注意事項

proc 項建立時要避免已經存在同名的 proc 項,否則註冊時核心會報錯(但還是會成功返回那個 proc 項),在刪除時有時會刪不掉(尤其是 proc 目錄)。

刪除乙個 proc 目錄會把這個目錄所有的 proc 檔案都刪除。

讀 proc 檔案

proc 檔案的讀需要自己提供乙個 read_proc_t 型別的函式放在 proc_dir_entry 結構中供 proc_file_read() 函式呼叫。下面是 read_proc_t 型別函式的定義:

typedef int (read_proc_t)(char *page, char **start, off_t off, int count, int *eof, void *data);

這個函式的定義很複雜,不過當 proc 檔案返回的資料量總是小於乙個 page_size 時可以簡化使用。關於這個函式以及它的那一大串引數我覺得再怎麼解釋都解釋不全,所以還是留給自己去看 proc_file_read() 的**就明白了。

寫 proc 檔案

proc 檔案的寫很簡單。如果是使用 proc_fs 預設提供的 file_operations 的話,要自己實現乙個 write_proc_t 型別的函式放在 proc_dir_entry 結構中供 proc_file_write() 函式呼叫。write_proc_t 型別函式的定義如下:

typedef int (write_proc_t)(struct file *file, const char __user *buffer, unsigned long count, void *data);

下面是 proc_file_write() 的實現:

static ssize_t proc_file_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos)

可見 proc 檔案的寫忽略了使用偏移量。

如果是使用自己提供的 file_operations 的話,那還是要自己實現乙個 write 函式賦給 file_operations 的 .write 指標。

乙個例子

#include

#include

#include

static struct proc_dir_entry *mydir;

static struct proc_dir_entry *pfile;

static char msg[255];

static int myproc_read(char *page, char **start, off_t off, int count, int *eof, void *data)

static int myproc_write(struct file *file, const char __user *buffer, unsigned long count, void *data)

static int __init myproc_init(void)

pfile = create_proc_entry("pool", 0666, mydir);

if (!pfile)

pfile->read_proc = myproc_read;

pfile->write_proc = myproc_write;

return 0;

}static void __exit myproc_exit(void)

module_init(myproc_init);

module_exit(myproc_exit);

這個例子建立乙個 /proc/mydir/pool,它相當於乙個池子,你向它寫什麼,你讀它的時候它就返回什麼,當然它的容量是有限的 :)

proc fs 使用說明

建立乙個 proc 檔案 根據對 proc 檔案的不同使用,核心提供了多種包裝函式來建立乙個 proc 檔案。方法一 struct proc dir entry create proc entry const char name,mode t mode,struct proc dir entry p...

核心 procfs 使用筆記

static inttest proc show struct seq file m,void v static inttest proc open struct inode inode,struct file file static const struct file operations tes...

使用說明 附註工具使用說明

附註工具使用說明 附註工具用途 附註工具主要用於更新利用word附註應用程式生成的帶域 的附註,該工具在word右鍵 更新鏈結 的基礎上進行了優化,故在使用時,不能再利用word右鍵 更新鏈結 而要用本工具的 更新當前鏈結 或 更新所有鏈結 使用說明 一 更換路徑 當利用word附註應用程式生成帶域...