Linux Signal (8): sigsetjmp和siglongjmp

 进程部分介绍过了setjmp和longjmp函数, 这两个函数在跳转时会带信号屏蔽字跳转, 在信号处理程序(hanlder)中使用longjmp会导致后来产生的这种信号被屏蔽.

POSIX.1 也没有具体说明setjmp和longjmp对信号屏蔽字的作用, 而是定义了两个新函数: sigsetjmp和siglongjmp.

1. 原型:

#include <setjmp.h>

int sigsetjmp(sigjmp_buf env, int savemask);
直接调用则返回0, 从siglongjmp调用返回则返回非0值.

void siglongjmp(sigjmp_buf env, int val);
可见发现sigsetjmp比setjmp多了一个参数savemask, 如果非0, 则sigsetjmp在env中保存进程的当前信号屏蔽字.


2. 实例:

还是老习惯, 用代码来验证

#include <signal.h>
#include <setjmp.h>
#include <stdio.h>
#include <stdlib.h>

/* Jump buffer */
static sigjmp_buf jmpbuf;

/* Signal handler */
static void myfunc(int signo)
{
    printf("SIGQUIT ");
    sleep(1);
    siglongjmp(jmpbuf, 1);
}

int main()
{
    char *p = NULL;
    struct sigaction act;
    act.sa_handler = myfunc;
    act.sa_flags = SA_INTERRUPT;
    sigemptyset(&act.sa_mask);

    if (sigaction(SIGQUIT, &act, NULL) < 0)
        perror("sigaction");

    if (sigsetjmp(jmpbuf, 1) == 1)
    {
        printf("I'm jumped ");
    }
    else
    {
        /* SIGSEGV */
        raise(SIGQUIT);
    }

    /* JUMP */
    printf("I'm here ");

    return 0;
}

这段代码首先用sigaction设定SIGQUIT信号的处理函数, 然后sigsetjmp设定sigjmp_buf, 当它从siglongjmp返回时显示I'm jumped, 第一次设定完成后产生SIGQUIT信号.

运行结果:

SIGQUIT
I'm jumped
I'm here

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/dai_weitao/archive/2007/09/28/1804610.aspx

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值