如何从Linux内核的PID中获取进程描述符?

时间:2018-09-17 05:02:54

标签: linux process linux-kernel pid

我试图弄清楚如何从PID中获取过程描述符。

http://www.linuxforums.org/forum/kernel/153873-getting-task_struct-process-using-its-pid.html开始,对于Linux内核2.4

static inline struct task_struct *find_task_by_pid(int pid)
{
    struct task_struct *p, **htable = &pidhash[pid_hashfn(pid)];

    for(p = *htable; p && p->pid != pid; p = p->pidhash_next)
        ;

    return p;
}

该链接似乎说pidhash[pid_hashfn(pid)]是指向task_struct对象的指针,该对象的PID为值pid

但是从《理解Linux内核》一书中似乎并非如此,该书讨论了Linux内核2.6.11。我不确定相关代码在2.6.11和2.4中是否相同。从书中,我了解到pidhash[pid_hashfn(pid)]的类型为hlist_head,它是指向hlist_node对象的指针。 hlist_node对象是pids[0].pid_chain对象的task_struct。然后如何从task_struct获取pidhash[pid_hashfn(pid)]对象?

请注意

谢谢。

1 个答案:

答案 0 :(得分:1)

在内核2.6.11中,task_struct包含数组pids[PIDTYPE_MAX],以便将给定任务同时放置在多个哈希表中。

pidhash包含指向PIDTYPE_MAX哈希表的指针。 pidhash[i]是第 i 个散列表的开头的指针。因此,pidhash[type][pid_hashfn(nr)]是指向链表的指针。

最好使用内核函数find_pid(type, nr)在给定pid类型struct pid *和pid pids[type]下找到type到任务的[nr]元素中。

然后,您可以使用基于NULL的宏pid_task将指向struct pid的(非{struct task_struct)指针转换为指向container-of的指针。