Posted on 2008-08-18 18:59
Prayer 閱讀(730)
評論(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就能避免這種情況