不知怎么的,似乎WCOREDUMP(status)
总是告诉我创建了一个core
文件。
当我收到fork()
信号时,我使用SIGCHLD
。
然后,当我使用waitpid(...&status...);
时,我看到了WIFSIGNALED(status)
的预期分段错误(代码11),而且不知怎的,当我调用WTERMSIG(status)
时,我也得到了正确的结果。
但是,默认情况下,Ubuntu设置为不生成核心转储文件。为什么WCOREDUMP(status)
仍然返回true?(除非WCOREDUMP()
文件保存在当前目录之外的其他位置?)
最佳答案
我发现核心转储文件由内核生成并发送到apport应用程序。信息可在man 5 core
中找到,其中有一个部分:
将堆芯转储到程序
这个程序在/proc/sys/kernel/core_pattern
中定义,在大多数Ubuntu系统上,如下所示:
|/usr/share/apport/apport %p %s %c %P
这意味着将核心转储数据通过管道传送到application apport,而application apport又可能决定在以下情况下将数据发送到文件:
崩溃的程序不是要向Ubuntu报告的程序;并且
过程的极限大于零。
因此,就内核而言,核心转储是生成的,因此
WCOREDUMP()
返回true是明智的。