inline pid_t pid_nr(struct pid *pid) 的主要是获得进程的全局pid号,也就是从init 所在的namespace看到的pid号
pid_nr() : global id, i.e. the id seen from the init namespace;
static inline pid_t pid_nr(struct pid *pid)
{
pid_t nr = 0;
if (pid)
nr = pid->numbers[0].nr;
return nr;
}
注意这里是取pid->numbers这个数组的index为0的pid 号
而pid_t pid_vnr(struct pid *pid) 则是虚拟pid,是从当前namespace 内部看到pid
pid_vnr() : virtual id, i.e. the id seen from the pid namespace of current.
pid_t pid_vnr(struct pid *pid)
{
return pid_nr_ns(pid, task_active_pid_ns(current));
}
pid_vnr 调用pid_nr_ns 从当前namespace 中找到对应的pid号
pid_t pid_nr_ns(struct pid *pid, struct pid_namespace *ns)
{
struct upid *upid;
pid_t nr = 0;
if (pid && ns->level <= pid->level) {
upid = &pid->numbers[ns->level];
if (upid->ns == ns)
nr = upid->nr;
}
return nr;
}
pid_nr_ns 则是从特定的namespace 查找pid号,查找时首先拿到pid->numbers数组中的值,其index是ns->level 这个值是upid,然后
判断upid的成员变量是不是等于形参中的ns,如果等于的话,则返回upid的成员变量nr作为虚拟局部pid号
进程管理API之pid_nr/pid_vnr/pid_nr_ns
最新推荐文章于 2023-05-19 09:46:14 发布