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

时间:2014-04-16 18:37:13

标签: c signals

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

但是,在fork()系统调用之后,此行为会发生更改:对于父级,一切都保持正常,但子级永远不会打印这些消息。为什么会如此,是否可以恢复到孩子的默认状态?

这是一个最小的例子:

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

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

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

    return 0;
}

输出为Segmentation fault,而我希望两个此类消息。

1 个答案:

答案 0 :(得分:3)

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

当孩子退出时,父进程会发送SIGCHLD信号。然后,它可以使用wait()系列调用之一来获取孩子的终止状态和杀死孩子的信号。