alarm,sigsetjmp,siglongjmp

/*      This is test for alarm and sigsetjmp and siglongjmp unix functions,
        and i learn how to use them from here.
        这三个函数结合在一起,用来设置程序的处理超时时间
        time: 2009-9-17 23:23
*/

 

#include stdio.h
#include signal.h
#include setjmp.h
#include unistd.h

/*Type of a signal handler 设置信号句柄 */
typedef void (*sighandler_t)(int);
static Timeout = 0;

/* 设置保存堆栈变量 */
jmp_buf Stackbuf;

void IOTimeOut(int no)
{
    Timeout = 1;
        siglongjmp(Stackbuf, Timeout);
}


int main(int argc, char *argv[])
{
        char str[30]="";

        /* psignal 输出对应信号int值的描述 */
        psignal(SIGSEGV, str);
        fprintf(stdout, "%s/n", str);

        sighandler_t pAlarmFun;

        /* 定义处理SIGALRM信号的函数,并且将原先的
        处理信号alarm的句柄保存在pAlarmFun里*/
        pAlarmFun = signal(SIGALRM, IOTimeOut);

        /* alarm(3)的意思是程序继续执行,但是3秒后将会发出SIGALRM信号 */
        /* 主要用来设置超时时间 */
        alarm(3);

        /* 这时会保存进程上下文,第一次执行时函数返回0,
        当调用过siglongjmp后,会从这里重新执行,但是函数
        的返回值变成了1 */
        sigsetjmp(Stackbuf, 1);

        if(Timeout){

                /*alarm(0)的意思是,如果参数seconds为0,
                则之前设置的闹钟会被取消,并将上次设置的
                alarm时间里,剩下的时间作为返回值。*/

                alarm(0);
                fprintf(stderr, "it's out of time/n");
                /* 恢复原先处理信号Alarm的句柄 */
                signal(SIGALRM, pAlarmFun);
                return -1;
        }

        while(1){
                fprintf(stdout, "test/n");
                sleep(1);
        }

 

        return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值