我有一个多线程应用程序,运行30多线程。我知道有一个错误,有时两个线程试图同时排序一个列表,这通常会导致其中一个线程访问无效内存。因此,为该线程生成了一个SIGSEGV
。SIGSEGV不终止进程
现在,根据我对信号的了解,线程应调用SIG_DFL
为SIGSEGV
,这是异常终止进程和coredump。然而,我看到这个过程仍然活着(处于一种不灵活的状态),执行停止,但过程仍然存在。当我试图kill
它时,SIGTERM
实际上传播到我的自定义信号处理程序(它试图很好地关闭所有线程),但它挂起,因为没有任何线程实际上执行了。我终于设法使用SIGQUIT
杀死它,并在那之后生成了核心文件。
所以我的问题是“异常终止”是什么意思?如果SIG_DFL
被称为SIGSEGV
,如何不能从内存中删除进程?可能会发生什么导致这种行为?我的Linux是红帽企业Linux服务器版本5.11(Tikanga)
编辑:我知道(或多或少)如何调试它,我甚至知道错误是什么。我的问题是或多或少:在SIGSEGV调用SIG_DFL时,RedHat究竟做了什么?问题在于这个过程没有响应,但也没有死亡 - 因此自动重启程序没有启动,我们有一些不愉快的停机时间。
你说你有一个自定义信号手柄,它有什么作用? – Adam
SIGTERM的预期行为是终止进程,但可以捕获SIGTERM并执行其他操作。 SIGKILL是不可撤销的强制退出。即'kill -9 12345' – Adam
另外,有没有'ps'列出你的程序为?如果是这样,这是一个僵尸进程(即它退出,但它的返回值尚未被启动过程读取)。 –
Adam