通常,当您的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
,而我希望两个此类消息。
答案 0 :(得分:3)
库中没有打印消息,它是由shell打印的。仅当其中一个子进程退出时才会通知进程。在fork之后,新进程是shell的孙子,因此shell不知道它并且在由于信号而退出时不会打印任何内容。
当孩子退出时,父进程会发送SIGCHLD
信号。然后,它可以使用wait()
系列调用之一来获取孩子的终止状态和杀死孩子的信号。