如何在linux中进行系统调用(我使用的是ubuntu)来转储系统中所有进程以及多线程程序中线程的信息?非常感谢你的帮助。
第一步是实现一个系统调用来列出进程。
内核将进程列表存储在一个名为task list
的循环双链接列表中。任务列表中的每个元素都是在<linux/sched.h>
中定义的类型为struct task_struct
的进程描述符。进程描述符包含有关特定进程的所有信息。
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)
在整个任务列表上进行迭代。在每次迭代中,task都指向列表中的下一个任务。
一旦在proclist.c
文件中实现了系统调用,现在,您必须将此系统调用添加到内核源代码中,重新编译内核,安装并重新启动以在用户空间中使用它。
编译内核:在编译之前先读一读(按照教程),如果出现任何问题,都会破坏系统。
注意:任何教程中提供的文件路径和文件名可能因内核版本而异,因此请小心。