免费注册 查看新帖 |

Chinaunix

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

为什么程序总是Alarm call????(AIX环境下的问题) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-05-14 21:24 |只看该作者 |倒序浏览
请教。
  情况是这样的,我在程序的开头忽略了所有的信号:
for(int j=0; j < 64; j++)
{
          signal(j,SIG_IGN);
}
然后定义:
signal(SIGALRM,Clean);
signal(SIGINT, Clean);

Clean函数定义如下:
void Clean( int signo )
{
        switch(signo)
        {
          case SIGALRM:
                        bExit = 0;
                        break;
          default:
                        bExit = 1;
                        break;
        }
}

然后我在程序中根据bExit这个标志进行判断,
以确定程序是否应该退出(bExit==1退出,否则不退出),

在处理过程,程序总是ALarm Call,然后退出。
  
   请教,这是怎么回事?  非常感谢!

论坛徽章:
0
2 [报告]
发表于 2003-05-14 21:31 |只看该作者

为什么程序总是Alarm call????(AIX环境下的问题)

signal是安装一次后只运行一次
就是以后想要再处理同样消息的话还要安装
signaction则不一样
看看是不是这个原因

论坛徽章:
0
3 [报告]
发表于 2003-05-14 21:36 |只看该作者

为什么程序总是Alarm call????(AIX环境下的问题)

难道AIX下和SCO UnixWare下的差别这么大,
同样的代码在UnixWare都是没有问题的,感觉很奇怪。
另外我在程序中使用了定时器,
定时器会定期发出SINALRM信号,
如果是这样的话,有可能是这样的问题,
我测试以下先。
谢谢

论坛徽章:
0
4 [报告]
发表于 2003-05-14 21:41 |只看该作者

为什么程序总是Alarm call????(AIX环境下的问题)

定时器会定期发出SINALRM信号,

看一下man手册
以前的话是有的系统signal函数安装一次
永远有效的

但新的POSIX标准定为一次安装有效一次

论坛徽章:
0
5 [报告]
发表于 2003-05-15 09:56 |只看该作者

为什么程序总是Alarm call????(AIX环境下的问题)

斑竹说的对,我昨天查过一些资料,BSD UNIX 就不会清除signal函数的处理函数指针,但其它类型的UNIX一般都会清除,需要重新设置一次才行。
   谢谢!

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
6 [报告]
发表于 2003-05-15 11:54 |只看该作者

为什么程序总是Alarm call????(AIX环境下的问题)

下面一段代码,测试一下,看看和你的有什么不同!

带等三秒钟,然后按中断监。

  1. #include <stdio.h>;
  2. #include <unistd.h>;
  3. #include <signal.h>;

  4. extern int bExit = 0;

  5. void Clean( int signo )
  6. {
  7.     (void)fprintf(stderr,"signo = %d\n", signo );
  8.     switch(signo)
  9.     {
  10.         case SIGALRM:
  11.             bExit = 0;
  12.             break;
  13.         default:
  14.             bExit = 1;
  15.             break;
  16.     }
  17. }

  18. int  main()
  19. {
  20.     for(int j=0; j < 64; j++)
  21.     {
  22.         signal(j,SIG_IGN);
  23.     }
  24.     signal(SIGALRM,Clean);
  25.     signal(SIGINT, Clean);
  26.     alarm(3);
  27.     while(1) {
  28.          ;
  29.     }
  30.     exit(0);
  31. }

复制代码

论坛徽章:
0
7 [报告]
发表于 2003-05-15 13:15 |只看该作者

为什么程序总是Alarm call????(AIX环境下的问题)

上述的写法依然有问题,每次调用SIGNAL函数时,AIX下会自动清除SIGNAL的调用的函数地址,需要重新设置一次signal函数,否则系统将自动调用缺省的系统函数,从而导致Alarm Call,而导致程序退出。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
8 [报告]
发表于 2003-05-15 13:33 |只看该作者

为什么程序总是Alarm call????(AIX环境下的问题)

每个系统处理方式不一样,楼上有位兄弟已经说明了原因。我在hp测试的。aix没有测试。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP