为什么sigsetjmp在c中使用的是setjmp函数

时间:2013-12-24 05:20:51

标签: c signals

任何人都可以解释为什么sigsetjmp函数正在使用而不是setjmp函数。

当我从书中提到它时,将setjmp与信号一起使用有一些缺点,以便它们实现sigsetjmp函数。

任何人都可以用例子解释这个。

先谢谢。

1 个答案:

答案 0 :(得分:8)

请参阅section 10.15 in “Advanced Programming in the UNIX® Environment”

  

setjmp和longjmp函数,可用于非局部   分枝。 longjmp函数通常从信号处理程序调用   返回程序的主循环,而不是从程序返回   处理程序。我们在图10.8和10.11中看到了这一点。

     

然而,调用longjmp存在问题。当信号是   捕获,信号捕获功能与当前输入   信号自动添加到过程的信号掩码中。   这可以防止后续出现的信号中断   信号处理程序。如果我们longjmp退出信号处理程序,那么   发生在进程的信号掩码上?

     

在FreeBSD 5.2.1和Mac OS X 10.3下,setjmp和longjmp保存并恢复信号掩码。但是,Linux 2.4.22和Solaris 9却没有   做这个。 FreeBSD和Mac OS X提供了_setjmp和   _longjmp,不保存和恢复信号掩码。

     

要允许任何一种行为,POSIX.1都不指定效果   setjmp和longjmp对信号掩码的影响。相反,两个新功能,   sigsetjmp和siglongjmp由POSIX.1定义。这两个功能   从信号处理程序分支时应始终使用。

     

...

     

这些函数与setjmp和longjmp之间的唯一区别   函数是sigsetjmp有一个额外的参数。如果是savemask   非零,然后sigsetjmp也保存当前的信号掩码   环境过程当调用siglongjmp时,如果env参数是   通过使用非零保存掩码调用sigsetjmp保存,然后使用siglongjmp   恢复保存的信号掩码。