C++ Linux下多线程进程的信号处理

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();

我在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 
    }
    
  • 如果在
    prog_init()
    操作过程中触发信号SIGTERM

    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 
    }
    
    内核将调用
    sighdr()
    ,跟踪文件可以记录相关信息。但随后过程停止了。由于第二个线程的代码量非常大,所以我无法定位最后一条指令。并且有几次(1/60),进程不会停止,但运行状态不正确,它在Linux的
    recvmsg()
    中被挂起,
    prog\u loop()
    将永远不会执行

  • 如果在
    prog\u loop()中触发信号SIGTERM

    进程运行正常,SIGTERM将被忽略

  • 运行后,/proc/pid/status

线程:2个
SigQ:0/124393
SigPnd:0000000000000000
ShdPnd:0000000000000000
SigBlk:0000000000000000
信号:000000000000000 5
SigCgt:0000000 180005000

所以我的问题是:
1) 这种现象有什么可能的原因吗?
2) 是否有任何调试方法来查找进程发生了什么?我试过谷磨,但没有找到有价值的东西