find_procee_by_pid函数详解

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;

}

pid0时,返回的是该进程号对应的进程描述符的地址,否者返回当前进程的地址。

实际上的工作由宏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()函数是从进程号哈希表中寻找进程,因此不管进程是出于何种状态,只要还没从哈希表中删除就能找到。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值