您的位置:首页 > 其它

进程管理API之find_ge_pid

2017-12-07 08:22 627 查看
struct pid *find_ge_pid(int nr, struct pid_namespace *ns)
函数用于在ns下找到pid 大于等于nr的struct pid。如果ns下正好有一个pid号等于nr,则find_ge_pid
函数和find_pid_ns的作用就是一样的.
其源码分析如下:
struct pid *find_ge_pid(int nr, struct pid_namespace *ns)
{
struct pid *pid;

do {
#调用find_pid_ns 在ns中找nr对应的pid,如果刚好找到的话,就退出了,此时
#find_ge_pid 的作用和find_pid_ns 是一样的
pid = find_pid_ns(nr, ns);
if (pid)
break;
#如果没有找到的话,则在ns的map中找下一个nr对应的pid,此时这个nr 就大于形参中的nr了
nr = next_pidmap(ns, nr);
} while (nr > 0);

return pid;
}
int next_pidmap(struct pid_namespace *pid_ns, unsigned int last)
{
int offset;
struct pidmap *map, *end;
#如果nr 已经大于最大值了,就退出
if (last >= PID_MAX_LIMIT)
return -1;

#这里的offset表示当前nr在pidmap中的偏移
offset = (last + 1) & BITS_PER_PAGE_MASK;
#map 执行last对应的地方
map = &pid_ns->pidmap[(last + 1)/BITS_PER_PAGE];
#pidmap的结束
end = &pid_ns->pidmap[PIDMAP_ENTRIES];
#然后通过for循环来遍历map——>page.找到下一个bit 1的偏移
for (; map < end; map++, offset = 0) {
if (unlikely(!map->page))
continue;
offset = find_next_bit((map)->page, BITS_PER_PAGE, offset);
if (offset < BITS_PER_PAGE)
根据在map中的offset,ns,map 反推出这个nr。
return mk_pid(pid_ns, map, offset);
}
return -1;
}
根据ns,offset,map 反推nr的公式如下:
static inline int mk_pid(struct pid_namespace *pid_ns,
struct pidmap *map, int off)
{
return (map - pid_ns->pidmap)*BITS_PER_PAGE + off;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: