系统调用之sys_gettid

这个系统调用返回当前进程当前namespace中leader线程的pid
其源码分析如下:
SYSCALL_DEFINE0(gettid)
{
	#从这里可以看出是返回当前进程current
	return task_pid_vnr(current);
}
static inline pid_t task_pid_vnr(struct task_struct *tsk)
{
	#读取的是PID
	return __task_pid_nr_ns(tsk, PIDTYPE_PID, NULL);
}
pid_t __task_pid_nr_ns(struct task_struct *task, enum pid_type type,
			struct pid_namespace *ns)
{
	pid_t nr = 0;

	rcu_read_lock();
	#本例中ns为null,所以采用当前进程的namespace
	if (!ns)
		ns = task_active_pid_ns(current);
	#如果当前进程已经死了,则返回0
	if (likely(pid_alive(task))) {
		if (type != PIDTYPE_PID) {
			if (type == __PIDTYPE_TGID)
				type = PIDTYPE_PID;
			#可以看到如果当前进程如果有很大线程,则取leader线程的pid
			task = task->group_leader;
		}
		nr = pid_nr_ns(rcu_dereference(task->pids[type].pid), ns);
	}
	rcu_read_unlock();

	return nr;
}

猜你喜欢

转载自blog.csdn.net/tiantao2012/article/details/80244550