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

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