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

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