linux 創建你的 /proc 文件


一旦你有一個定義好的 read_proc 函數, 你應當連接它到 /proc 層次中的一個入口項. 使用一個 creat_proc_read_entry 調用:

 

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);

 

 

這里, name 是要創建的文件名子, mod 是文件的保護掩碼(缺省系統范圍時可以作為 0 傳遞), base 指出要創建的文件的目錄( 如果 base 是 NULL, 文件在 /proc 根下創建 ), read_proc 是實現文件的 read_proc 函數, data 被內核忽略( 但是傳遞給 read_proc). 這就是 scull 使用的調用, 來使它的 /proc 函數可用做 /proc/scullmem:

 

68

 

 

 

create_proc_read_entry("scullmem", 0 /* default mode */,

NULL /* parent dir */, scull_read_procmem, NULL /* client data */);

 

這里, 我們創建了一個名為 scullmem 的文件, 直接在 /proc 下, 帶有缺省的, 全局可 讀的保護.

 

目錄入口指針可用來在 /proc 下創建整個目錄層次. 但是, 注意, 一個入口放在 /proc 的子目錄下會更容易, 通過簡單地給出目錄名子作為這個入口名子的一部分 -- 只要這個 目錄自身已經存在. 例如, 一個(常常被忽略)傳統的是 /proc 中與設備驅動相連的入口 應當在 driver/ 子目錄下; scull 能夠安放它的入口在那里, 簡單地通過指定它為名子 driver/scullmem.

 

/proc 中的入口, 當然, 應當在模塊卸載后去除. remove_proc_entry 是恢復 create_proc_read_entry 所做的事情的函數:

 

remove_proc_entry("scullmem", NULL /* parent dir */);

 

去除入口失敗會導致在不希望的時間調用, 或者, 如果你的模塊已被卸載, 內核崩掉.

 

當如展示的使用 /proc 文件, 你必須記住幾個實現的麻煩事 -- 不要奇怪現在不鼓勵使 用它.

 

最重要的問題是關於去除 /proc 入口. 這樣的去除很可能在文件使用時發生, 因為沒有 所有者關聯到 /proc 入口, 因此使用它們不會作用到模塊的引用計數. 這個問題可以簡 單的觸發, 例如通過運行 sleep 100 < /proc/myfile, 剛好在去除模塊之前.

 

另外一個問題時關於用同樣的名子注冊兩個入口. 內核信任驅動, 不會檢查名子是否已經 注冊了, 因此如果你不小心, 你可能會使用同樣的名子注冊兩個或多個入口. 這是一個已 知發生在教室中的問題, 這樣的入口是不能區分的, 不但在你存取它們時, 而且在你調用 remove_proc_entry 時.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM