如何从task_struct获取最年幼的PID

时间:2015-10-13 00:12:08

标签: c linux struct kernel child-process

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

结构的一个字段是进程中最小的子进程的PID,我一直在struct task_struct中搜索有关this的信息,如下所示:http://lxr.free-electrons.com/source/include/linux/sched.h。我一直在测试我的新系统调用,而且我似乎无法从struct list_head子节点找到合适的PID值。

我的测试函数包括分叉子,存储fork的返回值,并将它与我在父的task_struct中做各种事情所获得的值进行比较。我得到了父的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);

这是否接近于尝试找到父进程中最小的子进程的正确方法?如何从该流程的task_struct中找到流程中最年轻的孩子的PID?

2 个答案:

答案 0 :(得分:0)

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

  

我的孩子名单

siblings

  

我父母的子女列表中的链接

因此可以使用

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

答案 1 :(得分:0)

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