Linux Signal (8): sigsetjmp和siglongjmp

原创 2007年09月28日 11:12:00

进程部分介绍过了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 *=
 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

uboot中raise:Signal #8 caught的根本原因

在移植uboot时编译一切正常,但uboot启动中加载自己写的网卡驱动出现问题,一直在打印raise:Signal #8 caught google  百度了一番,也有很多人遇到了这个问题,大家都说出...
  • skyflying2012
  • skyflying2012
  • 2014年07月02日 15:42
  • 3910

LINUX SIGNAL信号标志详解

在终端使用kill -l 命令可以显示所有的信号。 $kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT...
  • js_xj
  • js_xj
  • 2011年08月16日 17:36
  • 12944

linux signal 详解

一 信号的种类 可靠信号与不可靠信号, 实时信号与非实时信号 可靠信号就是实时信号, 那些从UNIX系统继承过来的信号都是非可靠信号, 表现在信号 不支持排队,信号可能会丢失, 比如...
  • vc0051127833
  • vc0051127833
  • 2012年06月13日 11:29
  • 20120

sigsetjmp,siglongjmp的使用

相关函数:longjmp, siglongjmp, setjmp 表头文件:#include 函数定义:int sigsetjmp(sigjmp_buf env, int savesigs) 函数说...
  • babyfans
  • babyfans
  • 2010年07月22日 11:40
  • 6903

《UNIX环境高级编程》笔记--sigsetjmp和siglongjmp函数

setjmp和longjmp函数用于非局部跳转,在信号处理程序中经常调用longjmp函数以返回到程序的主循环中,而不是从该处理 程序返回。但是调用longjmp有一个问题,当捕捉到一个信号时,进入进...
  • TODD911
  • TODD911
  • 2013年12月14日 14:50
  • 4198

sigsetjmp和siglongjmp详解

相关函数:longjmp, siglongjmp, setjmp  表头文件:#include   函数定义:int sigsetjmp(sigjmp_buf env, int savesigs)  ...
  • yuan_hong_wei
  • yuan_hong_wei
  • 2015年11月09日 15:36
  • 927

5.6.2 sigsetjmp/siglongjmp错误处理架构

smtp_proto采用了sigsetjmp和siglongjmp来进行异常处理。当在协议解析过程中遇到异常时,可以通过siglongjmp跳到错误处理代码: /smtpd/smtpd.c 4754...
  • wk2056991
  • wk2056991
  • 2016年04月07日 14:03
  • 261

在Linux信号处理中longjmp和siglongjmp

以下是我网上搜索到的,觉得写的还行,记录下来以供以后查阅。 相关函数:longjmp, siglongjmp, setjmp  表头文件:#include   函数定义:int sigsetj...
  • bigengine
  • bigengine
  • 2016年02月10日 14:54
  • 579

《unix环境高级编程》信号——sigsetjmp 函数和 siglongjmp 函数

前面《异常处理》介绍了两个关于用于非局部跳转的 setjmp 和 longjmp 函数,在信号处理程序中经常调用 longjmp 函数以返回到程序的主循环中,而不是从该处理程序返回。但是调用 long...
  • zhoudengqing
  • zhoudengqing
  • 2014年11月25日 16:27
  • 312

sigsetjmp用法

相关函数:longjmp, siglongjmp, setjmp  表头文件:#include   函数定义:int sigsetjmp(sigjmp_buf env, int savesigs)...
  • u013457146
  • u013457146
  • 2014年10月21日 15:40
  • 341
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux Signal (8): sigsetjmp和siglongjmp
举报原因:
原因补充:

(最多只允许输入30个字)