哈爾濱理工大學(xué)軟件工程專業(yè)08-7李萬鵬原創(chuàng)作品,轉(zhuǎn)載請標(biāo)明出處
http://blog.csdn.net/woshixingaaa/archive/2011/04/15/6324900.aspx
這里使用/proc文件系統(tǒng)顯示出進程列表。/proc文件系統(tǒng)是一種特殊的,由軟件創(chuàng)建的文件系統(tǒng),內(nèi)核使用它向外界導(dǎo)出信息。/proc下的每個文件都綁定于一個內(nèi)核函數(shù),用戶讀
取其中的文件時,該函數(shù)動態(tài)的生成文件的”內(nèi)容”。現(xiàn)代Linux發(fā)行版中的很多工具都是通過/proc/來獲取它們需要的信息,例如ps,top和uptime。/proc存于內(nèi)存中,關(guān)機后就
消失了。
所有使用/proc的模塊必須包含<linux/proc_fs.h>,并通過這個頭文件來定義正確的函數(shù)。為創(chuàng)建一個只讀的/proc文件,驅(qū)動必須實現(xiàn)一個函數(shù),用于讀取文件時生成數(shù)據(jù)。
當(dāng)某個進程讀取這個文件時,讀取請求會通過這個函數(shù)發(fā)送到驅(qū)動程序模塊。在某個進程讀取我們的/proc文件時,內(nèi)核會分配一個內(nèi)存頁(PAGE_SIZE字節(jié)的內(nèi)存塊),驅(qū)動程序可
以將數(shù)據(jù)通過這個內(nèi)存頁返回到用戶空間。該緩沖區(qū)會傳入傳入我們定義的函數(shù),而該函數(shù)稱為read_proc方法:
一旦創(chuàng)建好了一個read_proc函數(shù),就需要把它與一個/proc入口項連接起來。這通過調(diào)用create_proc_read_entry實現(xiàn):
其中,name是要創(chuàng)建的文件名稱;mode是該文件的保護掩碼,base是該文件所在的目錄,read_proc是實現(xiàn)文件的read_proc函數(shù),內(nèi)核會忽略data參數(shù),但是會將該函數(shù)傳遞給
read_proc。
在卸載模塊時,/proc中的入口項也應(yīng)被刪除。remove_proc_entry就是用來撤銷create_proc_read_entry所做的工作的:
在read_myproc中,我們打印進程列表的信息。這里我是通過手動遍歷的,沒有使用list_for_each函數(shù)。在內(nèi)核中進程是使用進程描述符task_struct來描述的,它是一個結(jié)構(gòu) 體,包含了進程的相關(guān)信息。這個結(jié)構(gòu)體的獲得是通過slab來分配的。正因為如此,所以UNIX有一個特性就是創(chuàng)建進程非常迅速。task_struct是通過list_head域鏈接到一起的,這 個雙向循環(huán)鏈表把所有的進程描述符串到了一起。在linux內(nèi)核鏈表中,不是鏈表結(jié)構(gòu)中包含數(shù)據(jù),而是在數(shù)據(jù)結(jié)構(gòu)中包含鏈表節(jié)點。init_task是0號進程的進程描述符(也就是傳說中的idle或swapper進程)。從它下一個開始遍歷,也就是從init進程開始。list_entry可以通過指向成員的指針獲得指向這個容器的指針。
顯示結(jié)果如下,我只截了部分:
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
