免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3231 | 回复: 4
打印 上一主题 下一主题

linux下signal接管不了信号,高手指点 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-09-24 16:59 |只看该作者 |倒序浏览
linux下编程,调用了signal函数,但是居然没有接管到SIGINT信号。

gdb调试原始程序时,signal函数执行了,传递SIGINT信号到我的调试程序,但是我的程序没有接管。
另外在我的主程序中使用了sleep。

后来我写了下面的测试程序,和原始代码相同结构。但是gdb调试的时候,信号接管居然成功了。郁闷,定位不了。
请问高手,有没有这方面的信号接管不到的经历? 请指点一把。


以下是我的测试程序,类同我的原始代码。

  1. #include <unistd.h>;
  2. #include <stdlib.h>;
  3. #include <string>;
  4. #include <iostream>;



  5. bool gv_MainStarted = false;                        //! 主程序是否已经启动了

  6. #include <fcntl.h>;
  7. #include <signal.h>;
  8. #include <string.h>;
  9. #include <assert.h>;
  10. #include <memory.h>;
  11. #include <errno.h>;
  12. #include <sys/stat.h>;


  13. #ifdef __OS_UNIX__
  14. #include "xol.h"                    //! 所用到的库文件, unix下使用
  15. #endif //__OS_UNIX__
  16. using namespace std;

  17. //! 信号处理
  18. void signal_process(int sig_id)
  19. {
  20.     cout << "sig_id : " <<sig_id <<endl;
  21.    
  22.     cout << gv_MainStarted <<endl;
  23.    
  24.     switch(sig_id)
  25.     {
  26.         case SIGINT:
  27.             if( !gv_MainStarted)
  28.                 exit(0);
  29.             cout << " SIGINT stop"<<endl;
  30.             break;
  31.         case SIGTERM:
  32.             if( !gv_MainStarted )
  33.                 exit(0);
  34.             cout << "SIGTERM stop"<<endl;
  35.             break;
  36.         case SIGSTOP:
  37.             if( !gv_MainStarted )
  38.                 exit(0);
  39.             cout << "SIGSTOP stop"<<endl;
  40.             break;
  41.         case SIGCONT:
  42.             if( !gv_MainStarted )
  43.                 exit(0);
  44.             cout << "SIGCONT stop"<<endl;
  45.             break;
  46.     }
  47.     signal(sig_id, signal_process);
  48. }


  49. int main(int argc, char* argv[])
  50. {

  51.    
  52.     signal(SIGTERM, signal_process);
  53.     signal(SIGINT,  signal_process);
  54.     signal(SIGSTOP,  signal_process);
  55.     signal(SIGCONT,  signal_process);
  56.    
  57.     gv_MainStarted = true;
  58.    

  59.     signal(SIGTERM, signal_process);
  60.     signal(SIGINT,  signal_process);
  61.     signal(SIGSTOP,  signal_process);
  62.     signal(SIGCONT,  signal_process);
  63.         int i;
  64.         for (i = 1;i < 2; i = 1)
  65.         {
  66.                 sleep(3);
  67.         }
  68.     return 0;
  69. }

复制代码
[/quote]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2004-09-24 18:52 |只看该作者

linux下signal接管不了信号,高手指点

你的程序运行时刻是否改变了进程组?改变了也收不到SIGINT信号的;

另外SIGINT是个不可靠的信号,因为
在进入你的signal_process与再次调用signal_process之间发生的SIGINT 信号将不会被你的程序捕获,
这期间的SIGINT信号会直接传递给系统init守护进程,
由于init守护进程对于SIGINT的默认处理是终止当前进程而导致你程序退出.
一般处理SIGINT的变通办法是将设为raw输入方式,通过getch判断是否是SIGINT

关于SIGINT不可靠的另外情况见下面的例子说明:
int sig_int_flag;                  /* set nonzero when signal occure */
main ()
{
        void sig_int ();               /* my signal handling function */
        ...
        signal (SIGINT, sig_int);      /* establish handler */
        ...
        while (sig_int_flag == 0)
            pause ();                  /* go to sleep, waiting for signal */
        ...
}

sig_int ()
{
      signal (SIGINT, sig_int);      
      /* reestablish handler for next occurrence */
      sig_int_flag = 1;       /* set flag for main loop to examine */
}
-------------------------------------------------------------------------------
    * 正常情况下, 上述程序将在发生 SIGINT 信号时继续运行.
    * 但在测试 sig_int_flag 的值为零,
       然后在调用 pause 之前发生了 SIGINT 信号,
      则 pause 函数将导致进程永远休眠.

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
3 [报告]
发表于 2004-09-24 21:04 |只看该作者

linux下signal接管不了信号,高手指点

你的程序我没法试验一下。
不过你不知道SIGSTOP信号是不能被捕获或忽略的吗?

论坛徽章:
0
4 [报告]
发表于 2004-09-27 10:18 |只看该作者

linux下signal接管不了信号,高手指点

我测试了,管用!!!结果如下:
sig_id : 2
1
SIGINT stop
sig_id : 2
1
SIGINT stop
sig_id : 2
1
SIGINT stop
sig_id : 2
1
SIGINT stop
sig_id : 2
1
SIGINT stop

论坛徽章:
0
5 [报告]
发表于 2004-09-27 11:03 |只看该作者

linux下signal接管不了信号,高手指点

对,写的测试代码是可以的。但是实际我的代码是不行的啊。
我想问问高手有没有碰到这样的情况。。。

原帖由 "yuanyawei" 发表:
我测试了,管用!!!结果如下:
sig_id : 2
1
SIGINT stop
sig_id : 2
1
SIGINT stop
sig_id : 2
1
SIGINT stop
sig_id : 2
1
SIGINT stop
sig_id : 2
1
SIGINT stop
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP