#include <stdio.h>
#include <signal.h>
#include <setjmp.h>
#include <unistd.h>
#include <sys/time.h>
sigjmp_buf jmp_env;
static void connect_alarm(int a)
{
siglongjmp(jmp_env, 1);
printf("connect_alarm\n");
}
int test() {
// 当超时时间sec_timeout大于等于运行时间run_time时会跳过printf("running...\n");
int sec_timeout = 3;
int run_time = 2;
int ret;
printf("timeout = %d, run time = %d\n", sec_timeout, run_time);
if (sec_timeout)
{
// 超过用alarm函数设置的时间时产生此信号,调用connect_alarm函数
signal(SIGALRM, connect_alarm);
alarm(sec_timeout);
printf("set timeout\n");
if (sigsetjmp(jmp_env, 1))
{
printf("timeout\n");
ret = 1;
} else {
ret = 2;
}
}
sleep(run_time);
printf("running...\n");
return ret;
}
int main()
{
int ret = test();
sleep(10);
printf("main quit ret = %d\n", ret);
return 0;
}
输出
timeout = 3, run time = 2
set timeout
running...
timeout
running...
main quit ret = 2
这说明sigsetjmp会返回多次,但是只会返回给调用函数一次,并且是最先返回的那次。 另外siglongjmp后的语句不会被执行, 那么后返回的那个siglongjmp的返回值就不处理了(是如何实现的呢???)