proc檔案系統

2021-07-10 08:50:18 字數 3083 閱讀 3908

proc檔案系統是由核心實現的檔案系統。當使用者態訪問/proc下檔案時,實際上是呼叫核心中和該檔案對應的特定函式。

一般用proc檔案來實現核心/驅動的呼叫。

大部分proc檔案是唯讀的,用於獲取核心資訊;

還有一些proc檔案是可寫的,當使用者態改變了proc檔案的內容時,會呼叫核心的函式,從而改變核心的對應行為。這些可寫的檔案,一般集中在/proc/sys下

proc檔案系統和sysfs檔案系統類似,是虛擬檔案系統,存在於記憶體中,用於核心和使用者程式互動等,檢視核心資訊。

基於/proc檔案系統如上所述的特殊性,其內的檔案也常被稱作虛擬檔案,並具有一些獨特的特點。例如,其中有些檔案雖然使用檢視命令檢視時會返回大量資訊,但檔案本身的大小卻會顯示為0位元組。此外,這些特殊檔案中大多數檔案的時間及日期屬性通常為當前系統時間和日期,這跟它們隨時會被重新整理(儲存於ram中)有關。為了檢視及使用上的方便,這些檔案通常會按照相關性進行分類儲存於不同的目錄甚至子目錄中,如/proc/scsi目錄中儲存的就是當前系統上所有scsi裝置的相關資訊,/proc/n中儲存的則是系統當前正在執行的程序的相關資訊,其中n為正在執行的程序(可以想象得到,在某程序結束後其相關目錄則會消失)。

/proc 檔案系統是由軟體建立,被核心用來向外界報告資訊的乙個檔案系統。/proc 下面的每乙個檔案都和乙個核心函式相關聯,當檔案的被讀取時,與之對應的核心函式用於產生檔案的內容。我們已經見到了很多這樣的檔案,例如,/proc/modules 總是返回當前核心中載入的模組。

(1)建立乙個 proc 檔案

structproc_dir_entry*create_proc_entry(const char *name, mode_t mode, structproc_dir_entry*parent)

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

引數 name 是要建立的 proc 檔名。

mode 是該檔案許可權值,例如 s_irugo,可傳入0表示採用系統預設值。

parent 指定該檔案的上層 proc 目錄項,如果為 null,表示建立在 /proc 根目錄下。create_proc_entry()完成的任務主要包括:檢測 mode 值,分配 proc_dir_entry 結構,註冊 proc_dir_entry。

(2)讀 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, intcount, int*eof, void *data);

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

(3)寫 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);

(4)刪除乙個 proc 項

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

(1)proc_rw.c

#include #include #include #include //copy_to|from_user

//在str中儲存使用者態write到檔案的字串

static char *str;

//proc檔案的讀函式

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

//proc檔案的寫函式

static int my_proc_write(struct file *filp, const char __user *buf, unsigned long count, void *data)

//釋放舊的字串,可以是null,為了清空之前存在的內容,每次都是覆蓋

kfree(str);

str = tmp;

return count;

}static int __init my_init(void)

//2.關聯讀寫函式

file->read_proc = my_proc_read;

file->write_proc = my_proc_write;

return 0;

}static void __exit my_exit(void)

module_init(my_init);

module_exit(my_exit);

module_author("jx");

module_license("gpl");

(2)makefile

obj-m:=proc_rw.o

kernel := /lib/modules/`uname -r`/build

all:

make -c $(kernel) m=`pwd` modules

install:

make -c $(kernel) m=`pwd` modules_install

depmod -a

clean:

make -c $(kernel) m=`pwd` clean

建立的是乙個可以讀寫proc檔案,下面是操作過程

Proc檔案系統

include static struct proc dir entry proc null int read proc char page,char start,off t off,int count,int eof,void data len sprintf page len,debug mod...

proc檔案系統

linux 將一切事物都看成檔案,硬體裝置在檔案系統中也有相應的條目。我們使用底層系統呼叫這樣一種特殊方式通過 dev目錄中的檔案來訪問硬體。控制硬體的軟體驅動程式通常可以以某種特定方式配置,或者能夠報告相關資訊。用於與裝置驅動程式進行通訊的工具在過去就已經十分常見,近來年,傾向於提供更一致的方式來...

proc檔案系統

linux系統上的 proc目錄是一種檔案系統,即proc檔案系統。與其它常見的檔案系統不同的是,proc是一種偽檔案系統 也即 虛擬檔案系統 儲存的是當前核心執行狀態的一系列特殊檔案,使用者可以通過這些檔案檢視有關系統硬體及當前正在執行程序的資訊,甚至可以通過更改其中某些檔案來改變核心的執行狀態。...