linux-kernel - reglas - manejo de llamadas al sistema
Hacer una llamada al sistema para obtener una lista de procesos (2)
¿Por qué implementarías una llamada al sistema para esto? No desea agregar un syscall a la API de Linux existente. Esta es la interfaz principal de Linux para el espacio de usuario y nadie toca syscalls, excepto los principales desarrolladores de Kernel que saben lo que hacen.
Si desea obtener una lista de procesos y sus parámetros y estados en tiempo real, use /proc
. Cada directorio que contiene un número entero es un ID de proceso existente y contiene un grupo de archivos dinámicos útiles que ps
, top
y otros usan para imprimir sus resultados.
Si desea obtener una lista de procesos dentro del núcleo (por ejemplo, dentro de un módulo), debe saber que los procesos se mantienen internamente como una lista doblemente enlazada que comienza con el proceso init
(símbolo init_task
en el kernel). Debe usar macros definidas en include/linux/sched.h
para obtener procesos. Aquí hay un ejemplo:
#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);
Esto debería estar bien para recopilar información. Sin embargo, no cambies nada allí a menos que realmente sepas lo que estás haciendo (lo que requerirá un poco más de lectura).
Soy nuevo en la programación de módulos y necesito hacer una llamada al sistema para recuperar los procesos del sistema y mostrar cuánto CPU están consumiendo.
¿Cómo puedo hacer esta llamada?
Hay llamadas de sistema para eso, llamadas abiertas, y de lectura. La información de todos los procesos se guarda en los /proc/{pid}
. Puede recopilar información de proceso leyendo los archivos correspondientes.
Más explicado aquí: http://www.tldp.org/LDP/Linux-Filesystem-Hierarchy/html/proc.html