为什么LibC不在fork之后打印错误消息?

为什么LibC不在fork之后打印错误消息?,c,signals,C,Signals,通常,当您的C程序捕捉到SIGSEGV信号并且没有安装处理程序时,标准C库将打印“分段错误”,然后终止进程。这在某些情况下非常有用 但是,在fork()系统调用后,此行为会发生变化:对于父级,一切都保持正常,但子级将永远不会打印这些消息。为什么会这样?它可以恢复为孩子的默认值吗 下面是一个简单的例子: #include <signal.h> #include <unistd.h> int main() { int pid = fork(); if (p

通常,当您的C程序捕捉到SIGSEGV信号并且没有安装处理程序时,标准C库将打印“分段错误”,然后终止进程。这在某些情况下非常有用

但是,在
fork()
系统调用后,此行为会发生变化:对于父级,一切都保持正常,但子级将永远不会打印这些消息。为什么会这样?它可以恢复为孩子的默认值吗

下面是一个简单的例子:

#include <signal.h>
#include <unistd.h>

int main() {
    int pid = fork();

    if (pid < 0) { return 1; }
    raise(SIGSEGV);

    return 0;
}
#包括
#包括
int main(){
int-pid=fork();
如果(pid<0){返回1;}
升起(SIGSEGV);
返回0;
}

输出是
Segmentation fault
,而我希望有两条这样的消息。

消息不是由库打印的,而是由shell打印的。进程只有在其自己的一个子进程退出时才会收到通知。在fork之后,新进程是shell的孙子,因此shell不知道它,并且在由于信号而退出时不会打印任何内容


当子进程退出时,会向父进程发送一个
SIGCHLD
信号。然后,它可以使用一个
wait()
系统调用家族来获取子对象的终止状态和终止该子对象的信号。

YFTR:父对象可以通过
wait()
检查子对象的退出状态,宏
WIFSIGNALED
WTERMSIG
提供有关是否/哪个信号导致子对象死亡的更多信息。