linux下创建proc文件系统,[转载]Linux下的proc文件系统(转载)
3、調用proc_register把ent加入proc文件系統(即proc文件樹)中。
4、返回ent;
proc_register函數
這個函數把一個proc文件加入到proc文件樹中,其函數原型如下:
static int proc_register(struct proc_dir_entry *parent,struct
proc_dir_entry *ent)
其主要流程如下:
1、使用make_inode_number()函數動態的到一個節點號,并且設置low_ino.注意只是獲得inod編號,并不是真的創建inode.該inode的創建會推遲到proc_lookup中。
2、將這個proc_dir_entry結構鏈接到它的父節點上。
3、根據文件類型(普通文件,目錄,symbolic)的不同,設置不同的缺省操作函數集。
刪除proc文件remove_proc_entry
這個函數用來刪除一個proc文件,注意如果該文件正被使用那么只是設置deleted標志,該函數的原型:
void remove_proc_entry(const char *name,struct proc_dir_entry
*parent);
其中name是待刪除的proc文件。parent是該文件的父目錄.
其執行流程如下:
1、確定其父目錄.乳溝parent有效,則執行2.否則(parent ==
NULL)嘗試從name分析出parent,如果分析失敗則函數返回失敗,否則執行2.
2、在parent中找出待刪的文件對應的proc_dir_entry實例ent.
3、把ent從proc文件樹中刪除,并更新樹的狀態。
4、如果該文件被使用則設置deleted標識(在其后的恰當時候會被釋放),否則調用free_proc_entry
其他proc文件操作函數
struct proc_dir_entry *proc_mkdir(const char *name,struct
proc_dir_entry *parent);
這個函數用來在proc文件系統中創建一個設別文件,因此,在創建proc_dir_entry結構后,沒有設置缺省操作,而是使用ent->rdev
= rdev指定了設備。最后,調用proc_registera函數將其注冊。
struct proc_dir_entry *proc_symlink(const char *name,struct
proc_dir_entry *parent,const char
*dest)函數,該函數創建了一鏈接文件,使用ent->mode =
S_IFLNK|S_IRUGO|S_IXUGO來標志,它和其他文件的建立很相似,只是,它將鏈接的目標文件名放在了ent->data域中。最后,它同樣調用proc_register函數將該結構注冊。
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)
創建只讀的proc文件,并且設置其對應的proc_dir_entry中的read_proc成員。
void create_seq_entry(char *name,mode_t mode ,struct
file_operations *f)
在/proc目錄下創建一個文件,其文件操作函數由f指定
內核還定義了很多其他的創建proc文件的方式,可以參考源代碼
假設現在有一個線程組,其TGID為32182,其包含了兩個線程:32182,32255.那么:執行ls
/proc,則能看到有一個32182的目錄;執行ls /proc/32182則能看到該線程組的信息;執行ls
/proc/32182/task則能看到兩個32182,32255
;執行ls /proc/32182/task/32182則能看到該task實例的信息;但如果我們執行ls
/proc/32255也能得到和執行ls /proc/32182同樣的效果
假設有一個線程組,其TGID為32243,其包含一個線程:32243.那么其效果類似上面的情況。
注意:針對/proc/TGID目錄下的各個文件,內核定義了一個全局屬祖tgid_base_stuff用來約定各個文件的基本信息,這個數據的元素的類型是pid_entry。同樣,內核也為/proc/TGID/task/PID目錄下的文件定義了全局數組tid_base_stuff.cd
ptg
/proc/tgid目錄的創建時機
(/proc/下的進程目錄)
當執行ls /proc是并不會創建線程組的相應目錄,而只是告訴你這個時刻的線程組的存在。只有當執行ls
/proc/tgid時,才會創建線程組相應的inode。即相應的inode實例是動態創建的
事實上,當執行ls
/proc時會調用proc_root_readdir(通過proc_root_operations)列出/proc目錄下的所有文件。針對/proc下的線程組,該函數會查詢內核的tgid鏈表。得到所有的tgid。然后轉化成字符串....
而當執行ls
/proc/TGID時最終會調用proc_root_lookup(通過proc_root_inode_operations),這個函數會為該目錄創建inode(其實是proc_inode實例),然后設置相應的inode_op,file_op,dentry_op等等信息。然后再調用proc_tgid_base_readdir(通過proc_tgid_base_operations變量)。而該函數又調用proc_pident_readdir來獲得/proc/TGID目錄下的所有文件的名字。
即相應inode創建時機是:
proc_root_lookup----proc_pid_lookup---proc_pid_make_inode
注意:
proc_fs對進程目錄與非進程目錄的處理有很大區別。
ini
總結
以上是生活随笔為你收集整理的linux下创建proc文件系统,[转载]Linux下的proc文件系统(转载)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux更改用户的shell,Linu
- 下一篇: linux nginx ssl 文件路径