2013-08-23 1 views
5

Я новичок в программировании модулей, и мне нужно сделать системный вызов для извлечения системных процессов и показать, сколько CPU они потребляют.Сделать системный вызов для получения списка процессов

Как я могу позвонить?

+0

Вы имеете в виду 'top' команды? – alfasin

+0

Вывод похож на верхнюю команду, но мне нужно выполнить системный вызов, который делает это. – douglasd3

ответ

13

Зачем вам осуществить системный вызов для этого? Вы не хотите добавлять системный вызов в существующий Linux API. Это основной интерфейс Linux для пользовательского пространства, и никто не касается системных вызовов, кроме топ-разработчиков ядра, которые знают, что они делают.

Если вы хотите получить список процессов и их параметры и статусы в реальном времени, используйте /proc. Каждый каталог, в котором есть целое число, есть существующий идентификатор процесса и содержит кучу полезных динамических файлов, которые 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

Ну, вам нужно получить стартовую задачу. Это часто делается «текущим», который является маркой. С этим вы можете получить текущую задачу. Он вернется с заданием. Затем вы можете начать с ним итерацию. – Wandy

0

Для этого есть системные вызовы, называемые открытыми и считанными. Информация всех процессов хранится в каталогах /proc/{pid}. Вы можете собирать информацию о процессе, читая соответствующие файлы.

Больше описано здесь: http://www.tldp.org/LDP/Linux-Filesystem-Hierarchy/html/proc.html