自定义实现的signal函数
#include <signal.h>
#include <stdio.h>
#include <setjmp.h>
/*
* signal function use sigaction
* */
typedef void Sigfunc(int signo);
static jmp_buf env_alarm;
Sigfunc* signal1(int signo,Sigfunc* func)
{
struct sigaction act,oact;
act.sa_handler = func;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
if(signo==SIGALRM) //timer
{
#ifdef SA_INTERRUPT
act.sa_flags |= SA_INTERRUPT;
#endif
}
else
{
#ifdef SA_RESTART
act.sa_flags |= SA_RESTART;
#endif
}
if(sigaction(signo,&act,&oact)<0)
return (SIG_ERR);
return (oact.sa_handler);
}
void sig_proc(int signo)
{
//timeout then return
longjmp(env_alarm,10); //10 means return value is 10;
}
int main()
{
int i=1;
int jmpret;
if(signal1(SIGALRM,sig_proc)==SIG_ERR)
{
printf("signal SIGALRM error\n");
return -1;
}
if((jmpret=setjmp(env_alarm))!=0) //longjmp return
{
printf("time out! return %d.\n",jmpret);// here will print return 10.
return 0;
}
alarm(2); //set timeer 2 second,and then call the sig_proc
while(i)
{
if(i%3==0)
printf("the value is:%d\n",i);
i++;
}
alarm(0);
return 0;
}
#include <stdio.h>
#include <setjmp.h>
/*
* signal function use sigaction
* */
typedef void Sigfunc(int signo);
static jmp_buf env_alarm;
Sigfunc* signal1(int signo,Sigfunc* func)
{
struct sigaction act,oact;
act.sa_handler = func;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
if(signo==SIGALRM) //timer
{
#ifdef SA_INTERRUPT
act.sa_flags |= SA_INTERRUPT;
#endif
}
else
{
#ifdef SA_RESTART
act.sa_flags |= SA_RESTART;
#endif
}
if(sigaction(signo,&act,&oact)<0)
return (SIG_ERR);
return (oact.sa_handler);
}
void sig_proc(int signo)
{
//timeout then return
longjmp(env_alarm,10); //10 means return value is 10;
}
int main()
{
int i=1;
int jmpret;
if(signal1(SIGALRM,sig_proc)==SIG_ERR)
{
printf("signal SIGALRM error\n");
return -1;
}
if((jmpret=setjmp(env_alarm))!=0) //longjmp return
{
printf("time out! return %d.\n",jmpret);// here will print return 10.
return 0;
}
alarm(2); //set timeer 2 second,and then call the sig_proc
while(i)
{
if(i%3==0)
printf("the value is:%d\n",i);
i++;
}
alarm(0);
return 0;
}
使用sigaction来实现signal函数,然后用一个例子测试一下.
该例子打印3的倍数,两秒运行后接收到SIGALRM信号. 超时退出.