我在Linux下调试一个多线程进程的信号处理时,发现了一种奇怪的现象。这个问题的一句话是“SIGTERM handler为空并且已成功注册到系统,但进程启动时仍可能被SIGTERM杀死”。
详细说明如下:
- 该进程由父进程派生,并由
execve
-
处理假操作
void sighdr(int sig) {
Trace();
}
main() {
sigaction(); // Register SIGTERM handler
prog_init(); // Very complex operation, read/write UNIX socket,
// starting new thread, and so on. The whole operation
// will take almost 12 seconds.
prog_loop(); // loop of main thread
}
-
如果信号 SIGTERM 在此过程中触发prog_init()
手术
The sighdr()
会被kernel调用,trace文件可以记录相关信息就OK了。但随后该过程停止了。由于第二个线程的代码量很大,所以我无法定位最后一条指令。而极少数情况下(1/60),进程不会被停止,但运行状态不正确,被挂起recvmsg()
Linux 的prog_loop()
永远不会被执行。
-
如果信号 SIGTERM 被触发prog_loop()
该过程运行良好,SIGTERM 将被忽略。
运行后,/proc/pid/status
线程:2
信号Q:0/124393
签名号:0000000000000000
电话号码:0000000000000000
信号块:0000000000000000
签名:0000000000000005
信号号:0000000180005000
所以我的问题是:
1)出现这种现象有什么可能的原因吗?
2)是否有任何调试方法来查找进程发生了什么?我尝试过 valgrind,但没有发现有价值的东西。
None
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)