Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 这叉子为什么挂着?_C_Unix_Fork - Fatal编程技术网

C 这叉子为什么挂着?

C 这叉子为什么挂着?,c,unix,fork,C,Unix,Fork,为什么节目还没有结束?孩子在打印完要打印的内容后挂起。如果父进程而不是子进程睡眠,它会工作,但为什么呢?我还尝试在每个进程结束时调用exit,但结果相同。我总是要等孩子说完吗 int main(){ int pid = fork(); char s[100] = "Hello"; if(pid > 0){ printf("FIRST PRINT IN PARENT: %s\n", s); strcat(s, " - PARENT

为什么节目还没有结束?孩子在打印完要打印的内容后挂起。如果父进程而不是子进程睡眠,它会工作,但为什么呢?我还尝试在每个进程结束时调用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;
}

一旦它的子进程(即代码中的父进程)退出,shell就会返回提示。然而, 它不知道您的代码启动的子进程

您观察到的问题的根源是父进程没有等待其子进程。 使用系统调用,例如
wait(0),在父进程中


不等待子进程的一般风险是,您可能最终会:;相反,(如果您先退出父进程)。

当父进程退出时,它可能会向子进程发送一个信号(
SIGHUP
)。 如果是这样,如果孩子没有捕捉到这个信号,孩子就死了

从历史上看,默认情况是进程在退出时向其子进程发送
SIGHUP
。现在,许多Linux发行版默认情况下不发送
SIGHUP

我在RHEL上试过你的代码,子进程没有被杀死。 因此父对象死亡,控件返回shell。子进程继续并在2秒后打印第二个输出

如果孩子确实收到了一个
SIGHUP
,它将不会挂起。它死了,最后的字符串永远不会打印出来

在Linux中,您可以通过
prctl
系统调用打开
SIGHUP

#include <sys/prctl.h>
prctl(PR_SET_PDEATHSIG, SIGHUP);
#包括
prctl(PRU设置更新、SIGHUP);

相关问题:

您确定它“挂起”了吗?不是因为终端打印了子对象的输出,并且不再显示提示?试着按
Enter
键,看看会发生什么。此外,如果仔细查看终端,您可能会看到子进程最后一次输出之前的提示。不是您,而是您的shell等待父进程终止。您必须使用双叉键才能立即恢复shell提示符。代码对我有效。如果您怀疑它处于“挂起”状态,它是否仍在
ps
输出中可见?