seq_file file system
針對proc檔案的不足而誕生了seq_file。
seq_file的實現基於proc檔案。使用seq_file,使用者必須抽象出乙個鏈結物件,然後可以依次遍歷這個鏈結物件。這個鏈結物件可以是鍊錶,陣列,雜湊表等等。
程式設計介面
seq_file必須實現四個操作函式:start(), next(), show(), stop()。
struct seq_operations
;start():
主要實現初始化工作,在遍歷乙個鏈結物件開始時,呼叫。返回乙個鏈結物件的偏移或者seq_start_token(表徵這是所有迴圈的開始)。出錯返回err_ptr。
stop():
當所有鏈結物件遍歷結束時呼叫。主要完成一些清理工作。
next():
show():
對遍歷物件進行操作的函式。主要是呼叫seq_printf(), seq_puts()之類的函式,列印出這個物件節點的資訊。
下圖描述了seq_file函式對乙個鍊錶的遍歷。
2、重要的資料結構
除了struct seq_operations以外,另乙個最重要的資料結構是struct seq_file:
struct seq_file ;
該結構會在seq_open函式呼叫中分配,然後作為引數傳遞給每個seq_file的操作函式。privat變數可以用來在各個操作函式之間傳遞引數。
3、seq_file使用示例:
#include
/* for use of init_net*/
#include
/* we\'re doing kernel work */
#include
/* specifically, a module */
#include
/* necessary because we use proc fs */
#include
/* for seq_file */
#define proc_name \"my_seq_proc\"
module_author(
\"dreamice:[email protected]\");
module_license(
\"gpl\");
static
void
*my_seq_start(
struct seq_file *s, loff_t *pos)
else
}static
void
*my_seq_next(
struct seq_file *s,
void
*v, loff_t *pos)
static
void my_seq_stop(
struct seq_file *s,
void
*v)static
int my_seq_show(
struct seq_file *s,
void
*v)static
struct seq_operations my_seq_ops =
;static
int my_open(
struct inode *inode,
struct
file
*file);
static
struct file_operations my_file_ops =
;int init_module(
void
)printk(kern_info\"initialze my_seq_proc success!\\n\");
return 0;
}/**
* this function is called when the module is unloaded.**/
void cleanup_module(
void)
該程式在/proc/net下註冊乙個my_seq_proc檔案。有興趣的朋友可以測試一下。
總結待續
Linux 檔案系統剖析
在檔案系統方面,linux 可以算得上作業系統中的 瑞士軍刀 linux 支援許多種檔案系統,從日誌型檔案系統到集群檔案系統和加密檔案系統。對於使用標準的和比較奇特的檔案系統以及開發檔案系統來說,linux 是極好的平台。本文討論 linux 核心中的虛擬檔案系統 vfs,有時候稱為虛擬檔案系統交換...
Android檔案系統深入剖析
1 android檔案系統的結構 android原始碼編譯後得到system.img,ramdisk.img,userdata.img映像檔案。其中,ramdisk.img是emulator的檔案系統,system.img包括了主要的包 庫等檔案,userdata.img包括了一些使用者資料,emu...
Android檔案系統深入剖析
1 android檔案系統的結構 android原始碼編譯後得到system.img,ramdisk.img,userdata.img映像檔案。其中,ramdisk.img是emulator的檔案系統,system.img包括了主要的包 庫等檔案,userdata.img包括了一些使用者資料,emu...