如何从 task_struct 获取最小 Child 的 PID

How to Obtain Youngest Child's PID from task_struct

我正在进行一个项目,该项目涉及为 Linux 3.18.20 编写新的系统调用。该系统调用应该在新定义的结构中存储有关当前 运行 进程的各种信息。

结构的一个字段是进程最年轻的 PID child,我一直在结构 task_struct 中搜索有关此的信息,定义如下:http://lxr.free-electrons.com/source/include/linux/sched.h。我一直在测试我的新系统调用,我似乎无法从结构 list_head children.

中找到合适的 PID 值

我的测试函数包括分叉一个 child,存储分叉的 return 值,并将它与我在 parent 中做各种事情得到的值进行比较 task_struct。我得到了 parent 的 task_struct,并且我尝试了结构 list_head 的以下所有宏以获得正确的 PID。 None 其中是正确的。

    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);

这是否接近尝试找到 parent 进程中最年轻的 child 的正确方法?我如何从该进程的 task_struct 中找到该进程最年轻的 child 的 PID?

作为对 task_struct 中字段的注释,children

list of my children

并且siblings

linkage in my parent's children list

因此可以使用

请求指向第一个子任务的指针
list_first_entry(&task->children, struct task_struct, siblings)

一个进程可以从它最后一次 fork(2) 系统调用中获得最年轻的进程 pid。您必须修补 clone(2) 系统调用(因为它是 linux 中 al fork 调用的基础)并将返回进程的 pid 存储在 u 区(或它在 linux kernel)所以当用户调用你的系统调用时你可以从那里得到它。