C 一种系统调用,用于转储有关多线程程序中所有系统进程和线程的信息
如何在linux(我正在使用ubuntu)中进行系统调用,以转储有关系统中所有进程以及多线程程序中线程的信息?非常感谢您的帮助。第一步是实现系统调用以列出流程 内核将进程列表存储在称为C 一种系统调用,用于转储有关多线程程序中所有系统进程和线程的信息,c,linux,linux-kernel,system-calls,C,Linux,Linux Kernel,System Calls,如何在linux(我正在使用ubuntu)中进行系统调用,以转储有关系统中所有进程以及多线程程序中线程的信息?非常感谢您的帮助。第一步是实现系统调用以列出流程 内核将进程列表存储在称为任务列表的循环双链接列表中。任务列表中的每个元素都是类型为struct task\u struct的过程描述符,该类型在中定义。流程描述符包含有关特定流程的所有信息 task_结构结构包含内核拥有和需要的关于进程的所有信息。进程描述符包含描述正在执行的程序打开文件、进程地址空间、挂起信号、进程状态等的数据 #inc
任务列表的循环双链接列表中。任务列表中的每个元素都是类型为struct task\u struct
的过程描述符,该类型在
中定义。流程描述符包含有关特定流程的所有信息
task_结构
结构包含内核拥有和需要的关于进程的所有信息。进程描述符包含描述正在执行的程序打开文件、进程地址空间、挂起信号、进程状态等的数据
#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;
}
#包括
#包括
#包括
asmlong系统进程列表(void*)
{
结构任务\u结构*任务;
对于每个流程(任务){
/*这将打印每个任务的名称和PID*/
printk(“%s[%d]\n”,任务->通信,任务->pid);
}
返回0;
}
每个进程(任务)的宏迭代整个任务列表。在每次迭代中,任务指向列表中的下一个任务
一旦在proclist.c
文件中实现了系统调用,
现在,您必须将此系统调用添加到内核源代码中,重新编译内核,安装并重新启动以在用户空间中使用它
编译内核:在编译内核之前先读一点书(遵循教程),如果出现任何问题,就会破坏系统
注意:任何教程中提供的文件路径和文件名可能因内核版本而异,因此请小心。您可以使用ps
命令:ps-eLf
我必须实际添加一个新的系统调用,然后在创建线程后在我的多线程程序上调用此系统调用。我该怎么做?为什么需要系统调用?您可以简单地使用系统(“ps-eLf”)代码>只是因为这是一个要求,如果不是的话,这会像一个符咒一样有效,谢谢。这是用于教育用途吗?我看不出系统调用的其他原因。内核通过/proc
文件系统支持所有这些信息。(这就是ps正在使用的)…您从哪里获得任务
?非常感谢,我现在就来试试。。。编译和安装模块是否正确?在内核中,任务
通常由指向内核堆栈中的任务结构
结构的指针直接引用。对于系统上运行的所有进程,宏逐个检索每个tast_结构的地址。遵循本教程,添加新的系统调用,很容易阅读。是的,确实,非常感谢。。很高兴我在这里找到了帮助,我很高兴我知道这很有趣