關於proc檔案系統對大檔案支援的若干問題

2021-05-23 23:25:26 字數 2506 閱讀 3525

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檔案的內容時,會呼叫核心的函式,從而改變核...