自定义实现的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;
}



使用sigaction来实现signal函数,然后用一个例子测试一下.
该例子打印3的倍数,两秒运行后接收到SIGALRM信号. 超时退出.
posted @ 2008-04-23 17:25  shipfi  阅读(1021)  评论(0编辑  收藏