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