当前位置: 技术问答>linux和unix
Linux进程为什么会有parent和real_parent,他们两个的区别是什么呢
来源: 互联网 发布时间:2017-05-02
本文导语: 如题,求详细说明一下。 | 我的理解是这样的,real_parent是亲爹,调fork的那个,parent呢是干爹,大部分情况下亲爹干爹是一个人,ps看到的是干爹,什么时候亲爹干爹不一样的,比如有一种情况,比如亲...
如题,求详细说明一下。
|
我的理解是这样的,real_parent是亲爹,调fork的那个,parent呢是干爹,大部分情况下亲爹干爹是一个人,ps看到的是干爹,什么时候亲爹干爹不一样的,比如有一种情况,比如亲爹死了,但是呢又得有一个父进程,比如1号进程就会被当成父进程。但进程不是1号fork出来的。
|
fork的那个是真parent,但真parent如果先退出了,子进程会被托管到1号进程,此时1号进程就是子进程的父进程,但不是真parent
|
内核的注释是这样子的:
/*
* pointers to (original) parent process, youngest child, younger sibling,
* older sibling, respectively. (p->father can be replaced with
* p->real_parent->pid)
*/
struct task_struct *real_parent; /* real parent process */
struct task_struct *parent; /* recipient of SIGCHLD, wait4() reports */
所以应该是有2楼说的那种作用,但是看代码还有些ptrace相关的地方会用到real_parent 和parent,比如:
static void do_notify_parent_cldstop(struct task_struct *tsk, int why)
{
..........
if (task_ptrace(tsk))
parent = tsk->parent;
else {
tsk = tsk->group_leader;
parent = tsk->real_parent;
}
........
}
所以可能在用KDB调试的时候有用,具体什么作用还不清楚。
baidu了一下,有这么一句段,可能又是另外一个用途,目前还没搞明白:
在Linux内核中,进程和POSIX线程有着相当微小的区别,父进程的定义也与UNIX不尽相同。Linux有两种父进程,分别称为(形式)父进程与实际父进程,对于一个子进程来说,其父进程是在子进程结束时收取SIGCHLD信号的进程,而实际父进程则是在多线程环境里实际创建该子进程的进程。对于普通进程来说,父进程与实际父进程是同一个进程,但对于一个以进程形式存在的POSIX线程,父进程和实际父进程可能是不一样的。
/*
* pointers to (original) parent process, youngest child, younger sibling,
* older sibling, respectively. (p->father can be replaced with
* p->real_parent->pid)
*/
struct task_struct *real_parent; /* real parent process */
struct task_struct *parent; /* recipient of SIGCHLD, wait4() reports */
所以应该是有2楼说的那种作用,但是看代码还有些ptrace相关的地方会用到real_parent 和parent,比如:
static void do_notify_parent_cldstop(struct task_struct *tsk, int why)
{
..........
if (task_ptrace(tsk))
parent = tsk->parent;
else {
tsk = tsk->group_leader;
parent = tsk->real_parent;
}
........
}
所以可能在用KDB调试的时候有用,具体什么作用还不清楚。
baidu了一下,有这么一句段,可能又是另外一个用途,目前还没搞明白:
在Linux内核中,进程和POSIX线程有着相当微小的区别,父进程的定义也与UNIX不尽相同。Linux有两种父进程,分别称为(形式)父进程与实际父进程,对于一个子进程来说,其父进程是在子进程结束时收取SIGCHLD信号的进程,而实际父进程则是在多线程环境里实际创建该子进程的进程。对于普通进程来说,父进程与实际父进程是同一个进程,但对于一个以进程形式存在的POSIX线程,父进程和实际父进程可能是不一样的。