进程管理API之__task_pid_nr_ns
2017-11-21 14:31
495 查看
pid_t __task_pid_nr_ns(struct task_struct *task, enum pid_type type,struct pid_namespace *ns) 此函数用于根据task和pid_namespace得到符合条件的进程号也就是pid号。 使用的例子如下: task_pid_nr_ns 函数通过调用__task_pid_nr_ns 得到符合task_struct *tsk和pid_namespace *ns的pid号 static inline pid_t task_pid_nr_ns(struct task_struct *tsk, struct pid_namespace *ns) { return __task_pid_nr_ns(tsk, PIDTYPE_PID, ns); } 其源码分析如下: pid_t __task_pid_nr_ns(struct task_struct *task, enum pid_type type, struct pid_namespace *ns) { pid_t nr = 0; //遍历task list需要通过rcu_read_lock来保护 rcu_read_lock(); //如果输入的ns为null,则取当前task的ns if (!ns) ns = task_active_pid_ns(current); //判断当前task是否live,这个条件用like修饰,说明一般情况下都成立 if (likely(pid_alive(task))) { //输入的enum pid_type type参数分两种情况,一种是PID,则返回当前ns下task的pid,一种是TGID,则返回 这个task 的领头的task的pid if (type != PIDTYPE_PID) { if (type == __PIDTYPE_TGID) type = PIDTYPE_PID; task = task->group_leader; } //根据task 对应的pid找到ns范围内的pid. nr = pid_nr_ns(rcu_dereference(task->pids[type].pid), ns); } rcu_read_unlock(); return nr; } 这里可能说的有点绕,看看下面的函数就明白了 pid_t pid_nr_ns(struct pid *pid, struct pid_namespace *ns) { struct upid *upid; pid_t nr = 0; // 如果当前pid的level 已经大于ns的level,则直接返回0,否则以ns->level 作为index找到对应upid, 如果upid 的name space等于我们的namespace,则返回upid的nr,作为__task_pid_nr_ns的最终返回值 if (pid && ns->level <= pid->level) { upid = &pid->numbers[ns->level]; if (upid->ns == ns) nr = upid->nr; } return nr; }
相关文章推荐
- 进程管理API之task_tgid_nr_ns
- 进程管理API之find_task_by_pid_ns
- 进程管理API之pid_nr/pid_vnr/pid_nr_ns
- 进程管理API之task_active_pid_ns
- 进程管理API之ns_of_pid
- 进程管理API之get_task_pid
- 进程管理API之get_pid_task
- 进程管理API之find_pid_ns
- 进程管理API之pid_task
- 进程管理API之get_task_mm
- Linux进程管理内核API函数pid_task( )
- 进程管理API之find_task_by_vpid
- 进程管理API之find_get_pid
- 进程管理API之get_pid/ put_pid
- 进程管理API之find_ge_pid
- window下强制杀死某个进程用taskkill /pid 进程号 -t -f命令
- 进程管理—进程描述符(task_struct)
- Linux下0号进程的前世(init_task进程)今生(idle进程)----Linux进程的管理与调度(五)【转】
- 进程管理的常用api的分类
- linux进程管理之task_struct结构体