进程管理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; }
相关文章推荐
- 进程管理API之find_pid_ns
- 进程管理API之find_task_by_pid_ns
- 进程管理API之find_get_pid
- 进程管理API之pid_task
- 进程管理API之get_pid_task
- 进程管理API之get_task_pid
- 进程管理API之task_active_pid_ns
- 进程管理API之get_pid/ put_pid
- 进程管理API之ns_of_pid
- 进程管理API之find_vpid
- 进程管理API之pid_nr/pid_vnr/pid_nr_ns
- 进程管理API之find_task_by_vpid
- 进程管理API之__task_pid_nr_ns
- 进程管理API之get_task_mm
- Linux进程管理内核API函数pid_task( )
- 进程管理的常用api的分类
- Atitit.进程管理常用api
- Atitit.进程管理常用api
- prjProcess - 进程管理 - Written By HackerJLY In Universty - VB6 + API
- Atitit.进程管理常用api