Unix 在exec上抛弃孩子的简单方法

Unix 在exec上抛弃孩子的简单方法,unix,exec,Unix,Exec,在执行新流程映像之前,是否有一种简单、标准的方法可以放弃所有子进程?类似于将文件描述符设置为在exec上关闭,最好让您的所有子项都被init采用。您可以忽略SIGCHLD,它(在某些平台上)可以部分解决所提出的问题,但这肯定是不可移植的。我真的没有看到这种行为的用例,但我很想知道是否有一个标准机制。这是一个非常有趣的问题 当您exec时,信号处理程序本身被设置回智能默认值(我认为挂起的信号被清除),但您在层次结构中仍然是相同的进程ID(PID),因此您仍然拥有正在运行的子进程 这意味着未来的信号

在执行新流程映像之前,是否有一种简单、标准的方法可以放弃所有子进程?类似于将文件描述符设置为在exec上关闭,最好让您的所有子项都被init采用。您可以忽略SIGCHLD,它(在某些平台上)可以部分解决所提出的问题,但这肯定是不可移植的。我真的没有看到这种行为的用例,但我很想知道是否有一个标准机制。

这是一个非常有趣的问题

当您
exec
时,信号处理程序本身被设置回智能默认值(我认为挂起的信号被清除),但您在层次结构中仍然是相同的进程ID(PID),因此您仍然拥有正在运行的子进程

这意味着未来的信号会在孩子们离开时找到他们的方向

避免这种情况的一种方法是,不要执行
exec
,而是偷偷地执行switchero。我的意思是,
fork
首先,然后让父进程简单地退出(因此当前子进程被
init
采用)


fork
生成的子进程具有完全不同的PID,因此在该点上与其他子进程只有兄弟关系。它可以
exec
执行您的新程序,并在没有孩子的情况下安全地运行。

信号通常会在整个exec中保留,但很容易重置。但是当忽略SIGCHLD时,一些平台显然具有不同的语义。我相信在某些平台中,子对象是fork之后的
init
的子对象,而不是执行fork的进程的子对象。