系统调用以转储有关多线程程序中所有系统进程和线程的信息

时间:2015-02-18 15:47:47

标签: c linux linux-kernel system-calls

如何在linux中进行系统调用(我使用的是ubuntu)来转储有关系统中所有进程的信息,以及有关多线程程序中的线程的信息?非常感谢你的帮助。

1 个答案:

答案 0 :(得分:0)

第一步是实现系统调用以列出进程。

内核将进程列表存储在名为task list的循环双向链表中。任务列表中的每个元素都是struct task_struct类型的进程描述符,在<linux/sched.h>中定义。进程描述符包含有关特定进程的所有信息。

task_struct结构包含内核对进程所需的所有信息。进程描述符包含描述正在执行的程序打开文件的数据,进程的地址空间,挂起的信号,进程的状态等等。

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

asmlinkage long sys_proclist(void*)
{
    struct task_struct *task;

    for_each_process(task) {
        /* this prints the name and PID of each task */
        printk("%s[%d]\n", task->comm, task->pid);
    }
    return 0;
}

for_each_process(task)遍历整个任务列表。在每次迭代中,任务指向列表中的下一个任务。

proclist.c文件中执行系统调用后, 现在你必须将这个系统调用添加到内核源代码,重新编译内核,安装并重启以在用户空间中使用它。

要编译内核:在执行之前做一些阅读(按照教程),如果出现任何问题,您将破坏系统。

注意:任何教程中提供的文件路径和文件名可能因内核版本而异,因此请小心。