我听别人说,如果一个信号在信号处理程序中被捕获,它不会生成一个核心转储——或者一个无用的核心转储。
正确吗?为什么?
核心转储通常是由其默认处理程序响应某些信号而生成的。如果你修改了那个处理器,你也修改了响应,所以不会得到core dump。
Core dump默认情况下是为响应由于失败(SIGSEGV(访问未映射内存),SIGILL(无效指令),SIGBUS(各种其他错误的系统访问)和SIGABRT信号而产生的信号而生成的,当程序本身检测到致命错误(在标准运行时,从assert或通过调用abort()
)时使用。它也是其他一些信号的默认值。特别是SIGUSR1,程序不应该接收它,除非它准备好处理它并更改处理程序。完整列表见man 7 signal
。
注意,"默认处理程序"不是应用程序中的代码。它是一个特殊的值,指示内核应该代表应用程序采取一些特定的操作。对于某些信号,此操作为退出,对于其他信号,此操作为退出并转储内核,而对于其他信号则不执行任何操作。