Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 一种系统调用,用于转储有关多线程程序中所有系统进程和线程的信息_C_Linux_Linux Kernel_System Calls - Fatal编程技术网

C 一种系统调用,用于转储有关多线程程序中所有系统进程和线程的信息

C 一种系统调用,用于转储有关多线程程序中所有系统进程和线程的信息,c,linux,linux-kernel,system-calls,C,Linux,Linux Kernel,System Calls,如何在linux(我正在使用ubuntu)中进行系统调用,以转储有关系统中所有进程以及多线程程序中线程的信息?非常感谢您的帮助。第一步是实现系统调用以列出流程 内核将进程列表存储在称为任务列表的循环双链接列表中。任务列表中的每个元素都是类型为struct task\u struct的过程描述符,该类型在中定义。流程描述符包含有关特定流程的所有信息 task_结构结构包含内核拥有和需要的关于进程的所有信息。进程描述符包含描述正在执行的程序打开文件、进程地址空间、挂起信号、进程状态等的数据 #inc

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

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

内核将进程列表存储在称为
任务列表的循环双链接列表中。任务列表中的每个元素都是类型为
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_结构的地址。遵循本教程,添加新的系统调用,很容易阅读。是的,确实,非常感谢。。很高兴我在这里找到了帮助,我很高兴我知道这很有趣