【发布时间】:2015-09-22 17:40:35
【问题描述】:
在Linux的C编程中,我知道wait()函数是用来等待子进程终止的,但是有没有一些方法(或函数)让子进程等待父进程终止?
【问题讨论】:
-
在父子之间创建一个管道。当父进程终止时,子进程将从管道中读取 EOF。
在Linux的C编程中,我知道wait()函数是用来等待子进程终止的,但是有没有一些方法(或函数)让子进程等待父进程终止?
【问题讨论】:
Linux 对此有一个扩展(如非 POSIX 函数)。查找prctl(“流程相关控制”)。
使用prctl,您可以安排孩子在父母去世时收到信号。查找与prctl 一起使用的PR_SET_PDEATHSIG 操作码。
例如,如果您将其设置为SIGKILL 信号,它有效地为我们提供了一种在父母死亡时让孩子死亡的方法。但当然,信号可以是孩子可以捕捉到的东西。
prctl 可以做各种其他事情。这就像一个ioctl,其目标是进程本身:一个“进程 ioctl”。
【讨论】:
signalfd 通过文件描述符同步获取信号(例如,通过select 进行监视)而不是通过处理程序异步获取信号(它允许安全的操作很少)
简短回答:不。
父进程可以控制其子进程的终端或进程组,这就是我们有wait() 和waitpid() 函数的原因。孩子没有对父母的那种控制,所以没有内置的东西。
如果您确实需要孩子知道其父母何时退出,您可以让父母在 atexit() 处理程序中向孩子发送信号,并让孩子捕捉该信号。
【讨论】:
在 Linux 中,您可以使用值为 PR_SET_PDEATHSIG 的 prctl 来建立一个信号,该信号将在创建它的 线程 死亡时发送到您的进程。也许你觉得它很有用。
【讨论】:
当父进程结束时,子进程被 init 采用,因此如果 ppid()==1 或 ppid()!= 而不是原始 PPID,则检查子进程就足够了 这意味着父进程已经完成。
【讨论】: