proc檔案系統憑藉其程式設計介面的「簡單易學」,和很多書籍和參考資料都把它放在較為靠前的位置(很多人看書都不能堅持到底),成為了那些需要快速開發的私有核心程式的「首選」核心空間和使用者空間通訊介面,被廣泛地應用於實際程式設計中。但是我們中大多都忽視了其「簡單」中由於種種細節所造成的「複雜」性,尤其在用它傳輸大量資料的時候。本文將努力詳盡地分析它的細節,給大家乙個參考。
首先,可以肯定的是proc檔案系統是
支援大檔案讀寫的。通常情況下,我們都是先通過函式create_proc_entry()建立乙個檔案記錄,然後將自己實現的讀函式read_proc、寫函式write_proc和檔案相關資料data賦值給剛才新建的檔案記錄。如下所示[
1]:entry = create_proc_entry(
"aint"
, 0644, myprocroot);if
(entry)
其中read_proc和write_proc的原型分別如下:
typedef
int(read_proc_t)
(char
*page,
char
**start, off_t off,
intcount
,int
*eof
,void
*data)
;
其引數分別表示:
page: 因為proc檔案系統讀操作實現的是:在讀的時候首先向系統申請乙個記憶體頁,然後將這個記憶體頁的起始位址作為第乙個引數(page)呼叫上面的函式,接著再將由上面的函式寫入page裡面的內容複製到使用者空間的緩衝區,所以
不需要校驗由page和count所標示的位址是否是合理的使用者空間位址,實際上校驗是無論如何也通過不了的,因為它切切實實地是核心空間的位址。
start: 這個引數有些特殊,ldd3(linux device driver 3rd edition)稱其的出現和用法為hack。start的用法也確實有些詭異,讀過核心裡面的相關注釋和原始碼後先總結如下:
在上面三種用法中,第二種曾經比較常用,也比較好用,但是hack的方法所帶來的不一致嚴重影響了人們對它的理解,所以現在的核心鼓勵用更好的seq_file api[
2]向使用者空間輸出面向記錄的資料。
off: 可以表示多種意圖,具體參見上面對引數start的解釋。
count: 表示這次呼叫使用者期待的資料量,一般小於頁大小。可以被忽略。
eof: 將*eof置為`1'表示已經讀到了檔案的結尾,換句話說這可能是最後一次返回資料,以後再也沒有多餘的資料可以返回。如果你忽略了count,那麼也請你同時忽略它。
data: proc檔案記錄中的資料成員data的值。
返回值: 統一表示寫到page所標示的緩衝區的位元組數。
怎麼樣,由start所引發的三種工作模式,確實夠讓人頭暈的吧?如果感覺我說的還是不甚明白(我都感覺自己在說繞口令),建議自己去閱讀核心的原始碼,那才是程式設計師間相互交流的語言。
typedef
int(write_proc_t)
(struct
file
*file
,const
char __user *buffer,
unsigned
long
count
,void
*data)
;
write_proc_t就要比read_proc_t簡潔許多了,引數意義也簡單明瞭,
file就是這個proc檔案所對應的檔案結構,
buffer和
count標示
使用者空間的緩衝區(需要謹慎對待),
data和read_proc_t中的data同義,都是表示proc檔案記錄中的資料成員data的值。你可能已經發現它的引數中沒有off選項了,不錯,它確實不區分對同乙個檔案連續呼叫的write,所以為了避免資料截斷,你有以下三種選擇:
也許你也會想到直接操縱file結構中的off_set屬性,不過很遺憾,此路不通。原因請看核心中的下列**:
loff_t pos = file_pos_read(
file);
ret = vfs_write(
file
, buf,
count
,&pos)
;file_pos_write(
file
, pos)
;
我想這就勿需再解釋什麼了。
看到這裡,我想你也該同意我剛才所說的話了吧?回想一下自己以前的**中是否有上面提到的細節問題,如果有趕緊去改正...
注意:proc檔案的get_info()介面本文並未提及,原因是太古老了。
參考資料:
[1]
在 linux 下使用者空間與核心空間資料交換的方式:procfs
[2]
在 linux 下使用者空間與核心空間資料交換的方式:seq_fs
[3]
manage /proc file with standard filesystem
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檔案系統
proc檔案系統是由核心實現的檔案系統。當使用者態訪問 proc下檔案時,實際上是呼叫核心中和該檔案對應的特定函式。一般用proc檔案來實現核心 驅動的呼叫。大部分proc檔案是唯讀的,用於獲取核心資訊 還有一些proc檔案是可寫的,當使用者態改變了proc檔案的內容時,會呼叫核心的函式,從而改變核...