进程管理API之__task_pid_nr_ns

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;
}

		

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值