如何从 Linux 内核中的 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)]是指向PID值为值pidtask_struct对象的指针。

但从《理解 Linux 内核》一书中,这似乎并非如此,该书谈到了 Linux 内核 2.6.11。我不确定 2.6.11 和 2.4 中的相关代码是否相同。从这本书中,我了解到pidhash[pid_hashfn(pid)]具有类型hlist_head,这是一个指向hlist_node对象的指针。hlist_node对象是task_struct对象的pids[0].pid_chain。那么如何从pidhash[pid_hashfn(pid)]获取task_struct对象呢?

请注意,

  • 我问这个问题只是为了阅读了解Linus内核(Linux内核2.6.11(,所以我不是在问最新的Linux内核版本,尽管你也可以提到它在最近的Linux内核版本中是如何完成的,这并没有什么坏处。

  • 我想我在这里遇到的困难与我之前的问题链表的节点存储谁的地址有关:其他节点,还是以节点作为字段的数据结构?

谢谢。

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

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

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

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

最新更新