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

如何从Linux内核中的PID获取进程描述符?,linux,process,linux-kernel,pid,Linux,Process,Linux Kernel,Pid,我试图找出如何从PID中获取进程描述符 来自,适用于Linux内核2.4 static inline struct task\u struct*按\u pid(int pid)查找\u task\u { struct task_struct*p,**htable=&pidhash[pid_hashfn(pid)]; 对于(p=*htable;p&&p->pid!=pid;p=p->pid\u next) ; 返回p; } 该链接似乎表示,pidhash[pid\u hashfn(pid)]是指

我试图找出如何从PID中获取进程描述符

来自,适用于Linux内核2.4

static inline struct task\u struct*按\u pid(int pid)查找\u task\u
{
struct task_struct*p,**htable=&pidhash[pid_hashfn(pid)];
对于(p=*htable;p&&p->pid!=pid;p=p->pid\u next)
;
返回p;
}
该链接似乎表示,
pidhash[pid\u hashfn(pid)]
是指向其pid为value
pid
task\u结构的对象的指针

但是,从《理解Linux内核》一书来看,这似乎不是真的,该书讨论了Linux内核2.6.11。我不确定2.6.11和2.4中的相关代码是否相同。从这本书中,我了解到,
pidhash[pid_hashfn(pid)]
具有类型
hlist_head
,它是指向
hlist_节点的指针。
hlist_节点
对象是
pids[0]。任务结构
对象的pid_链
。那么如何从
pidhash[pid\u hashfn(pid)]
获取
task\u struct
对象呢

注意

  • 我问这个问题只是为了阅读理解Linus内核(Linux内核2.6.11),所以我不是在问最近的Linux内核版本,尽管你也可以提到它在最近的Linux内核版本中是如何实现的,这并不有害

  • 我想我在这里遇到的困难与我前面的问题有关


谢谢。

在内核2.6.11
任务结构中
包含数组,以便将给定任务同时放置在多个哈希表中

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

最好使用核函数在任务的[
pids[type]
]元素中找到
struct pid*
,该元素具有给定的pid类型
type
和pid
nr

然后,您可以使用基于
的宏的容器将指向结构pid的指针(非NULL)转换为指向结构任务的指针