2013-08-23 36 views
5

我是模塊編程的新手,我需要進行系統調用以檢索系統進程並顯示它們消耗多少CPU。進行系統調用以獲取進程列表

我該如何撥打此電話?

+0

你是指'頂部'命令? – alfasin

+0

輸出就像一個頂級命令,但我需要做一個系統調用來做到這一點。 – douglasd3

回答

13

爲什麼你會實現這個系統調用?您不想將系統調用添加到現有的Linux API。這是用戶空間的主要Linux接口,除了知道他們在做什麼的頂級內核開發人員之外,沒有人接觸到系統調用。

如果您想獲取進程及其參數和實時狀態的列表,請使用/proc。每個存在整數的目錄都有一個現有的進程ID,幷包含一些有用的動態文件,其中ps,top等用於打印其輸出。

如果你想獲得內核中的進程列表(例如在一個模塊內),你應該知道這些進程在內部保存爲一個雙向鏈表,以init進程開始(內核中的符號init_task) 。您應該使用include/linux/sched.h中定義的宏來獲取進程。這裏有一個例子:

#include <linux/module.h> 
#include <linux/printk.h> 
#include <linux/sched.h> 

static int __init ex_init(void) 
{ 
    struct task_struct *task; 

    for_each_process(task) 
     pr_info("%s [%d]\n", task->comm, task->pid); 

    return 0; 
} 

static void __exit ex_fini(void) 
{ 
} 

module_init(ex_init); 
module_exit(ex_fini); 

這應該沒關係收集信息。但是,除非你真的知道你在做什麼(這將需要更多的閱讀),不要改變那裏的任何東西。

+0

你能提供一些關於如何使用它以及它是如何工作的一些解釋 –

+0

那麼,你必須得到啓動任務。它通常由「當前」完成,這是一個marco。有了這個,你可以獲得當前正在運行的任務。它將返回一個任務。然後你可以開始迭代它。 – Wandy