如何在linux中进行系统调用(我使用的是ubuntu)来转储有关系统中所有进程的信息,以及有关多线程程序中的线程的信息?非常感谢你的帮助。
答案 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
文件中执行系统调用后,
现在你必须将这个系统调用添加到内核源代码,重新编译内核,安装并重启以在用户空间中使用它。
要编译内核:在执行之前做一些阅读(按照教程),如果出现任何问题,您将破坏系统。
注意:任何教程中提供的文件路径和文件名可能因内核版本而异,因此请小心。