Posted on 2008-08-18 18:59
Prayer 阅读(723)
评论(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就能避免这种情况