您的位置:首页 > 其它

alarm,sigsetjmp,siglongjmp

2009-09-18 00:31 387 查看
/* 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: