我正在尝试弄清楚如何从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值为值pid
的task_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-of
宏pid_task
将(非NULL
(指向struct pid
的指针转换为指向struct task_struct
的指针。