免费注册 查看新帖 |

Chinaunix

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

奇怪的SIGALRM是没有捕获还是就没有发出 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-08-14 09:19 |只看该作者 |倒序浏览
如下代码
#include <string.h>
#include <stdlib.h>

//static int mclock = 1;


typedef struct {
    int mclock;
} DEF;

DEF adef;
int mclock = 1;

void sigroutine(int signo)
{
    switch (signo)
    {
        case SIGALRM:
        adef.mclock = 1;
        mclock = 1;
        printf("catch a SIGALRM\n");
        break;
    }
}

int main()
{
    int maxproc = 5;
    pid_t pid;
    for(int i = 1; i <= maxproc; i++)
    {
        pid = fork();
        if( pid < 0 )
        {
            return -1;
        }
        else if( pid > 0 )
        {
            continue;
        }
        else
        {
            adef.mclock = 1;
            int life = 20;
            while(1)
            {
               
                if ( 1 == adef.mclock)
                {
                    printf("alarm at 5s reached!\n");
                    adef.mclock = 0;
                    signal(SIGALRM,sigroutine);
                    alarm(1);
                }
                else
                {
                    printf("why is the alarm late?\n");
                    sleep (5);
                }
               
                life -= 1;
                if(life < 0)
                {
                    exit(0);
                }
               
            }
        }
    }
   
    sleep(10);
    return 0;
}


可以输出 catch a SIGALRM 这句话,同样的代码扔到一个pc程序里就好象没有发出SIGALRM 或是没有捕获.
会是编译选项或者别的什么问题吗?搞了一天了,谢谢高人指点
看有的地方说是sleep 和alarm用的一个计数器,但是上面的代码就有catch a SIGALRM 输出.

忘了说了:HP_UX B.11.11(不知道版本是不是这个东西?)

[ 本帖最后由 月波无漾 于 2007-8-14 09:25 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-08-14 10:42 |只看该作者
sleep和alarm不要一起用吧~~

论坛徽章:
0
3 [报告]
发表于 2007-08-14 11:28 |只看该作者
原帖由 baohuaihuai 于 2007-8-14 10:42 发表
sleep和alarm不要一起用吧~~

在我有有问题的那个程序里把sleep去掉就可以捕获到SIGALRM了,但是上面的程序也sleep 也 alarm 怎么就没问题了?
而且同样的程序在SUN下也没问题.

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2007-08-14 11:33 |只看该作者
man sleep

论坛徽章:
0
5 [报告]
发表于 2007-08-14 11:46 |只看该作者
原帖由 flw 于 2007-8-14 11:33 发表
man sleep

看了,还是不懂为什么此可用彼不可用。

论坛徽章:
0
6 [报告]
发表于 2007-08-14 12:57 |只看该作者
原帖由 月波无漾 于 2007-8-14 11:46 发表

看了,还是不懂为什么此可用彼不可用。


可能是因为它们都需要使用OS的定时器,如果定时器只有一个的话,那么就有问题了

瞎猜的,仅可参考。

论坛徽章:
0
7 [报告]
发表于 2007-08-14 13:02 |只看该作者
原帖由 月波无漾 于 2007-8-14 11:46 发表

看了,还是不懂为什么此可用彼不可用。

sleep的实现不同嘛,所以不奇怪。

论坛徽章:
0
8 [报告]
发表于 2007-08-14 13:06 |只看该作者
原帖由 flw2 于 2007-8-14 12:57 发表


可能是因为它们都需要使用OS的定时器,如果定时器只有一个的话,那么就有问题了

瞎猜的,仅可参考。



是的,内核为每个进程只能维持一个TIMER,两个一起搞很可能会有问题的,see apue for details

论坛徽章:
0
9 [报告]
发表于 2007-08-14 18:32 |只看该作者
不是两个timer的问题,是sleep 可能也是用 alarm实现的,都是处理ALARM信号。
man sleep:
BUGS
       sleep()  may  be implemented using SIGALRM; mixing calls to alarm() and
       sleep() is a bad idea.

       Using longjmp() from a signal handler  or  modifying  the  handling  of
       SIGALRM while sleeping will cause undefined results.

[ 本帖最后由 icydancer 于 2007-8-14 18:34 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP