日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

Solaris內(nèi)核目錄( 五 )



/usr/include/sys/proc/prdata.h

typedef struct prnode
{
vnode_t * pr_next; /* list of all vnodes for process */
prcommon_t * pr_common; /* common data structure */
prcommon_t * pr_pcommon; /*
* process common data structure
* 和上面那個(gè)成員什么區(qū)別
*/
vnode_t ** pr_files; /* contained files array (directory) */
vnode_t pr_vnode; /* embedded vnode 這里不是指針 */
} prnode_t;

/*
* Common file object to which all /proc vnodes for a specific process
* or lwp refer. One for the process, one for each lwp.
*/
typedef struct prcommon
{
int prc_slot; /* process slot number */
} prcommon_t;

/usr/include/sys/vnode.h

/*
* All of the fIElds in the vnode are read-only once they are initialized
* (created) except for:
* v_flag: protected by v_lock
* v_count: protected by v_lock
* v_pages: file system must keep page list in sync with file size
* v_filocks: protected by flock_lock in flock.c
* v_shrlocks: protected by v_lock
*/
typedef struct vnode
{
CADdr_t v_data; /* private data for fs */
} vnode_t;

/usr/include/sys/thread.h

typedef struct _kthread
{
struct vnode * t_trace; /* pointer to /proc lwp vnode */
} kthread_t;

圖3演示了打開一個(gè)procfs文件進(jìn)行讀寫時(shí)部分相關(guān)procfs數(shù)據(jù)結(jié)構(gòu)和它們之間
的關(guān)聯(lián) 。注意到一個(gè)進(jìn)程相關(guān)的所有vnodes通過(guò)prnode結(jié)構(gòu)的pr_next成員鏈接起來(lái) 。當(dāng)引用一個(gè)procfs目錄以及目錄下的文件對(duì)象時(shí),內(nèi)核動(dòng)態(tài)創(chuàng)建必要的數(shù)據(jù)結(jié)構(gòu)支持這種文件I/O請(qǐng)求,同時(shí)也是動(dòng)態(tài)銷毀相關(guān)數(shù)據(jù)結(jié)構(gòu) 。無(wú)論什么時(shí)候針對(duì)procfs目錄或文件做open(2)請(qǐng)求或者列舉procfs目錄或文件,它們似乎總是在那里,類似冰箱里的燈,當(dāng)你打開冰箱的時(shí)候它總是亮著的,但是關(guān)上冰箱門之后它事實(shí)上關(guān)閉著 。

通過(guò)procfs所能訪問(wèn)到的數(shù)據(jù)顯然總是位于內(nèi)核proc結(jié)構(gòu)以及其他一些數(shù)據(jù)結(jié)構(gòu)
中,這些數(shù)據(jù)結(jié)構(gòu)共同構(gòu)成了Solaris內(nèi)核中完整的進(jìn)程模型 。應(yīng)用程序通過(guò)procfs可以獲取進(jìn)程數(shù)據(jù),控制進(jìn)程執(zhí)行 。這樣做的好處是隱藏了內(nèi)核進(jìn)程模型的底層細(xì)節(jié),以一種相對(duì)普通的方式析取感興趣的數(shù)據(jù)、進(jìn)行進(jìn)程控制 。請(qǐng)求發(fā)生時(shí)建立這種動(dòng)態(tài)抽象,只要針對(duì)特定文件的訪問(wèn)存在,這種動(dòng)態(tài)抽象就一直保持著 。

針對(duì)procfs的文件I/O操作遵循傳統(tǒng)方式,打開文件獲取文件句柄,讀寫,關(guān)閉
文件句柄 。通過(guò)vnode開關(guān)表機(jī)制進(jìn)行procfs相關(guān)vnode操作時(shí),創(chuàng)建并初始化prnode和prcommon結(jié)構(gòu),這通常是應(yīng)用程序文件請(qǐng)求導(dǎo)致的結(jié)果 。實(shí)際的procfs vnode操作由相關(guān)的查找、讀寫函數(shù)處理/proc目錄下的對(duì)象 。

procfs遍歷和讀取請(qǐng)求采用一組函數(shù)指針實(shí)現(xiàn),這組函數(shù)實(shí)現(xiàn)procfs文件類型相
關(guān)操作 。文件類型分兩層維護(hù) 。在vnode的v_type成員中,procfs文件類型定義成VPROC 。而prnode結(jié)構(gòu)的pr_type成員定義了這個(gè)特定procfs文件的類型 。procfs文件類型直接描述了/proc目錄結(jié)構(gòu),參看/usr/include/sys/proc/prdata.h文件 。

/*
* Node types for /proc files (directories and files contained therein).
*/
typedef enum prnodetype
{
PR_PROCDIR, /* /proc */
PR_PIDDIR, /* /proc/ */
PR_AS, /* /proc//as */
PR_CTL, /* /proc//ctl */
PR_STATUS, /* /proc//status */
PR_LSTATUS, /* /proc//lstatus */
PR_PSINFO, /* /proc//psinfo */
PR_LPSINFO, /* /proc//lpsinfo */
PR_MAP, /* /proc//map */
} prnodetype_t;

打開一個(gè)procfs文件時(shí)的基本流程如圖4所示 。

--------------------------------------------------------------------------

open( "/proc//", O_RDONLY );
| Specific procfs directory object
代| vn_open() lookup functions are invoked
| through the pr_lookup_function[]
碼|----> lookupxxx() array
| | VOP_LOOKUP() -> prlookup()
流| | index based on type

推薦閱讀