find_procee_by_pid函数详解
每个进程都有一个唯一的进程号pid,如何通过这个唯一的进程号来找到对应的进程,在很多应用中是一个关键问题。函数find_process_by_pid提供的就是这个功能。
首先,我们来看该函数的原型:
static inline task_t *find_process_by_pid(pid_t pid)
{
return pid ? find_task_by_pid(pid) : current;
}
当pid非0时,返回的是该进程号对应的进程描述符的地址,否者返回当前进程的地址。
实际上的工作由宏find_task_by_pid(pid)完成,该宏定义为:#define find_task_by_pid(nr) find_task_by_pid_type(PIDTYPE_PID, nr)。我们知道所有的进程的标识符都组织成哈希表结构,在2.6内核中有4个不同的用途的哈希表。
enum pid_type{
PIDTYPE_PID; //所有进程号组织的哈希表
PIDTYPE_TGID; //线程号哈希表
PIDTYPE_PGID; //线程组号哈希表
PIDTYPE_SID; //进程组号哈希表
PIDTYPE_MAX;
}
这个宏告诉接下来的函数,要找的进程在进程号哈希表里。
task_t *find_task_by_pid_type(int type, int nr)
{
struct pid *pid;
pid = find_pid(type, nr);
if (!pid)
return NULL;
return pid_task(&pid->pid_list, type);
}
函数调用find_pid()函数,该函数从哈希表中寻找对应进程号的struct pid结构地址,每个进程的描述符都是通过该结构的pid_list链接。
最后调用pid_task()函数返回找到的进程的描述符首地址。
毫无疑问,find_process_by_pid()函数是从进程号哈希表中寻找进程,因此不管进程是出于何种状态,只要还没从哈希表中删除就能找到。