Chinaunix

标题: 奇怪的SIGALRM是没有捕获还是就没有发出 [打印本页]

作者: 月波无漾    时间: 2007-08-14 09:19
标题: 奇怪的SIGALRM是没有捕获还是就没有发出
如下代码
#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 编辑 ]
作者: baohuaihuai    时间: 2007-08-14 10:42
sleep和alarm不要一起用吧~~
作者: 月波无漾    时间: 2007-08-14 11:28
原帖由 baohuaihuai 于 2007-8-14 10:42 发表
sleep和alarm不要一起用吧~~

在我有有问题的那个程序里把sleep去掉就可以捕获到SIGALRM了,但是上面的程序也sleep 也 alarm 怎么就没问题了?
而且同样的程序在SUN下也没问题.
作者: flw    时间: 2007-08-14 11:33
man sleep
作者: 月波无漾    时间: 2007-08-14 11:46
原帖由 flw 于 2007-8-14 11:33 发表
man sleep

看了,还是不懂为什么此可用彼不可用。
作者: flw2    时间: 2007-08-14 12:57
原帖由 月波无漾 于 2007-8-14 11:46 发表

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


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

瞎猜的,仅可参考。
作者: 福瑞哈哥    时间: 2007-08-14 13:02
原帖由 月波无漾 于 2007-8-14 11:46 发表

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

sleep的实现不同嘛,所以不奇怪。
作者: Jiangge    时间: 2007-08-14 13:06
原帖由 flw2 于 2007-8-14 12:57 发表


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

瞎猜的,仅可参考。



是的,内核为每个进程只能维持一个TIMER,两个一起搞很可能会有问题的,see apue for details
作者: icydancer    时间: 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 编辑 ]




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2