信号SIGTERM处理Linux下的多线程进程

时间:2015-01-22 06:13:13

标签: c++ linux multithreading signals

我在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,但没有找到任何有价值的东西。

0 个答案:

没有答案