我在Linux下调试一个多线程进程的信号处理,发现一个奇怪的外观。在这个问题的句子中是“SIGTERM处理程序是空的并且已成功注册到系统,但是当进程启动时,进程可能仍被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()
操作过程中被触发
内核将调用sighdr()
,跟踪文件可以记录相关信息。但随后流程停止了。由于第二个线程的代码量非常大,所以我无法定位最后一条指令。并且很少次(1/60),该过程不会停止,但运行状态不正确,它在Linux的recvmsg()
中被挂起,prog_loop()
永远不会被执行。
如果信号SIGTERM在prog_loop()
流程运行正常,SIGTERM将被忽略。
运行后,/ proc / pid / status
主题:2
SigQ:0/124393
SigPnd:0000000000000000
ShdPnd:0000000000000000
SigBlk:0000000000000000
SigIgn:0000000000000005
SigCgt:0000000180005000
所以我的问题:
1)这种现象有可能的原因吗?
2)是否有任何调试方法可以找到进程发生的情况?我尝试了valgrind,但没有找到任何有价值的东西。