C++ Linux下多线程进程的信号处理
我在Linux下调试一个多线程进程的信号处理,发现了一个奇怪的现象。这个问题的一句话是“SIGTERM处理程序为空,已成功注册到系统,但进程启动时仍可能被SIGTERM终止” 详细说明如下:C++ Linux下多线程进程的信号处理,c++,linux,multithreading,signals,C++,Linux,Multithreading,Signals,我在Linux下调试一个多线程进程的信号处理,发现了一个奇怪的现象。这个问题的一句话是“SIGTERM处理程序为空,已成功注册到系统,但进程启动时仍可能被SIGTERM终止” 详细说明如下: 此进程由父进程分叉,并由execve 处理假操作 void sighdr(int sig) { Trace(); } main() { sigaction(); // Register SIGTERM handler prog_init();
- 此进程由父进程分叉,并由
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 }
- 如果在
操作过程中触发信号SIGTERMprog_init()
内核将调用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 }
,跟踪文件可以记录相关信息。但随后过程停止了。由于第二个线程的代码量非常大,所以我无法定位最后一条指令。并且有几次(1/60),进程不会停止,但运行状态不正确,它在Linux的sighdr()
中被挂起,recvmsg()
将永远不会执行prog\u loop()
- 如果在
prog\u loop()中触发信号SIGTERM 进程运行正常,SIGTERM将被忽略
- 运行后,/proc/pid/status
SigQ:0/124393
SigPnd:0000000000000000
ShdPnd:0000000000000000
SigBlk:0000000000000000
信号:000000000000000 5
SigCgt:0000000 180005000 所以我的问题是:
1) 这种现象有什么可能的原因吗?
2) 是否有任何调试方法来查找进程发生了什么?我试过谷磨,但没有找到有价值的东西