本文共 1601 字,大约阅读时间需要 5 分钟。
#define __NR_getpid 172__SYSCALL(__NR_getpid, sys_getpid) =>SYSCALL_DEFINE0(getpid) // sys_getpid - return the thread group id of the current process { return task_tgid_vnr(current); =>pid_t task_tgid_vnr(struct task_struct *tsk) { return __task_pid_nr_ns(tsk, __PIDTYPE_TGID, 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(); if (!ns) ns = task_active_pid_ns(current); =>struct pid_namespace *task_active_pid_ns(struct task_struct *tsk) { return ns_of_pid(task_pid(tsk)); =>struct pid *task_pid(struct task_struct *task) { return task->pids[PIDTYPE_PID].pid; } =>struct pid_namespace *ns_of_pid(struct pid *pid) { struct pid_namespace *ns = NULL; if (pid) ns = pid->numbers[pid->level].ns; return ns; } } if (likely(pid_alive(task))) { if (type != PIDTYPE_PID) { if (type == __PIDTYPE_TGID) type = PIDTYPE_PID; task = task->group_leader; } nr = pid_nr_ns(rcu_dereference(task->pids[type].pid), ns); =>pid_t pid_nr_ns(struct pid *pid, struct pid_namespace *ns) { struct upid *upid; pid_t nr = 0; if (pid && ns->level <= pid->level) { upid = &pid->numbers[ns->level]; if (upid->ns == ns) nr = upid->nr; } return nr; } } rcu_read_unlock(); return nr; } } }
Linux进程描述符task_struct结构体详解--Linux进程的管理与调度(一)
https://kernel.blog.csdn.net/article/details/51383272内核中current实现
https://www.cnblogs.com/tsecer/p/10487596.html