我正在做一个项目,其中包括为Linux3.18.20编写一个新的系统调用。这个系统调用应该在一个新定义的结构中存储有关当前正在运行的进程的各种信息。
struct的一个字段是进程最小子进程的PID,我一直在struct task结构中搜索这方面的信息,定义如下:http://lxr.free-electrons.com/source/include/linux/sched.h。我一直在测试我的新系统调用,但似乎无法从struct list_head children中找到适当的PID值。
我的测试函数包括派生一个子对象,存储fork的返回值,并将其与在父任务结构中执行各种操作所得到的值进行比较。我得到了父级的task_struct,并尝试了以下所有struct list_head宏以获得正确的PID。他们都不对。

    printk("list_next_entry pid = %d\n", list_next_entry(task, children)->pid);
printk("list_prev_entry pid = %d\n", list_prev_entry(task, children)->pid);
printk("list_entry pid = %d\n", list_entry(&task->children, struct task_struct, children)->pid);
printk("list_first_entry pid = %d\n", list_first_entry(&task->children, struct task_struct, children)->pid);
printk("list_last_entry pid = %d\n", list_last_entry(&task->children, struct task_struct, children)->pid);

这是不是更接近正确的方法来寻找最小的孩子的父母过程?如何从进程的任务结构中找到进程最小子进程的PID?

最佳答案

作为对task_struct注释中字段的注释,children
我的孩子名单
siblings
我父母子女列表中的链接
所以指向第一个子任务的指针可以使用

list_first_entry(&task->children, struct task_struct, siblings)

10-06 16:13