sigsetjmp, siglongjmp


#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的返回值就不处理了(是如何实现的呢???)

发布了113 篇原创文章 · 获赞 22 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/woai110120130/article/details/100175707