[英]Why does this fork hang?
为什么程序没有结束? 打印完必须打印的内容后,孩子会挂起。 如果父进程睡觉而不是子进程睡觉,它会起作用,但为什么呢? 我也试过在每个进程结束时调用 exit ,但结果相同。 我总是要等孩子完成吗?
int main(){
int pid = fork();
char s[100] = "Hello";
if(pid > 0){
printf("FIRST PRINT IN PARENT: %s\n", s);
strcat(s, " - PARENT");
printf("SECOND PRINT IN PARENT: %s\n", s);
}
else if(pid == 0){
printf("IMMEDIATELY IN CHILD: %s\n", s);
sleep(2);
printf("AFTER 2 SCONDS IN CHILD: %s\n", s);
}
return 0;
}
当父母退出时,它可能会向孩子发送一个信号( SIGHUP
)。 如果是这样,如果孩子没有捕捉到那个信号,孩子就会死。
从历史上看,默认情况下,进程在退出时向其子进程发送SIGHUP
。 现在,许多 Linux 发行版默认不发送SIGHUP
。
我在 RHEL 上尝试了你的代码,但子进程没有被杀死。 所以父级死亡,控制权返回到 shell。 孩子继续并在 2 秒后打印它的第二个输出。
如果孩子确实收到了SIGHUP
它不会挂起。 它死了,最后的字符串永远不会被打印出来。
在 Linux 中,您可以通过prctl
系统调用打开SIGHUP
:
#include <sys/prctl.h>
prctl(PR_SET_PDEATHSIG, SIGHUP);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.