我已经理解:
1)waitpid用于等待子进程死亡并收集SIGCHLD和子进程的退出状态等信息。
2)当我们为SIGCHLD设置了信号处理程序时,我们会做一些与清理子进程相关的工作或其他工作(由程序员自定),然后执行waitpid,以防止子进程成为僵尸进程,然后返回。
现在,当我们进行fork / exec并且子进程返回时,我们是否需要在程序中同时包含1和2? 如果我们都有,那么首先获取SIGCHLD信号,因此将首先调用信号处理程序,从而成功地调用了它的waitpid,而不是父进程代码中的waitpid,如下所示:
现在,当我们进行fork / exec并且子进程返回时,我们是否需要在程序中同时包含1和2? 如果我们都有,那么首先获取SIGCHLD信号,因此将首先调用信号处理程序,从而成功地调用了它的waitpid,而不是父进程代码中的waitpid,如下所示:
my_signal_handler_for_sigchld
{
do something
tmp = waitpid(-1,NULL,0);
print tmp (which is the correct value of the child pid)
}
int main ()
{
sigaction(SIGCHLD, my_signal_handler_for_sigchld)
fork()
if (child) //do something, return
if parent // waitpid(child_pid, NULL,0); print value returned from this waitpid - it is -1
}
希望有人能帮助我理解这个。
当子进程终止时,它的管道末端将被关闭
吗? 要非常精确,难道不应该是当子进程关闭连接到这个管道末端的FD,并且没有其他进程具有连接到该管道末端的FD,则管道另一端将被标记为关闭(接收EOF)
? 我相信这将更准确地解释发生了什么,以及超过2个具有与管道相连的FD的进程的重要特殊情况。 - nh2