Prayer

在一般中寻求卓越
posts - 1256, comments - 190, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

关于alarm设置与Signal

Posted on 2008-08-18 18:59 Prayer 阅读(721) 评论(0)  编辑 收藏 引用 所属分类: LINUX/UNIX/AIX

通过alarm设置时钟,当达到设置的时候后收到alarm信号,然后通过longjmp和setjmp进行跳转,
每次收到信号时都进行alarm(0)恢复,但是一共收到6次alarm信号左右就收不到了
这是什么原因?
现在我用测试代码试了一下,只能收到一次alarm信号:

代码:
#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/timeb.h>
#include <sys/uio.h>
#include <fcntl.h>
#include <time.h>
#include <string.h>
#include <signal.h>
#include <stropts.h>
#include <poll.h>
#include <pthread.h>
#include <stdlib.h>
#include <ctype.h>
#include <setjmp.h>
#include <sys/time.h>

void sig_alarm(int signo);

jmp_buf env;

int main(int argc, char **argv)
{
        int n;
        int jmp_flag=0;
        int set_alarm=0;
        char line[10];

        if(signal(SIGALRM, sig_alarm)==SIG_ERR)
                printf("signal error\n");
       
        //if(jmp_flag==0)
        //{
        //        if(setjmp(env)!=0)
        //                printf("set jmp error\n");
        //        jmp_flag=1;
        //}
        setjmp(env);
        printf("set_alarm=%d\n", set_alarm);
        if(set_alarm==1)
        {
                printf("release alarm\n");
                n=alarm(0);
                printf("return=%d\n", n);
        }
        printf("set jmp\n");
       
        set_alarm=1;
        n=alarm(5);
        printf("n=%d\n", n);
       

        if(n=read(STDIN_FILENO, line, 10)<0)
        {
                printf("read error\n");
        }
       
        alarm(0);
        write(STDOUT_FILENO, line, n);
        printf("stop\n");
        return 0;
       
}

void sig_alarm(int signo)
{
        longjmp(env, 1);
}

日志如下:
set_alarm=0
set jmp
n=0
set_alarm=1
release alarm
return=0
set jmp
n=0

signal是安装一次后就恢复成默认的处理方式

现在一般使用sigaction

signal换成sigset就能避免这种情况


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理