为什么在C中使用`sigsetjmp`而不是`setjmp`函数? [英] Why use `sigsetjmp` instead of `setjmp` function in C?
本文介绍了为什么在C中使用`sigsetjmp`而不是`setjmp`函数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
为什么有人会选择在C中使用sigsetjmp
而不是setjmp
?
我在一本书上看到,setjmp
和信号相关的代码一起使用有一些缺点,所以实现了sigsetjmp
功能。
有人能举例说明吗?
提前感谢。
推荐答案
参见section 10.15 in "Advanced Programming in the UNIX® Environment":
setjmp和long jmp函数,可用于非本地 分枝。Longjmp函数通常从信号处理程序调用 返回到程序的主循环,而不是从 操作员。我们在图10.8和10.11中看到了这一点。 但是,调用long jmp有一个问题。当信号是 捕获时,使用电流进入信号捕获功能 自动将信号添加到进程的信号掩码。 这可防止该信号的后续出现中断 信号处理程序。如果我们长时间跳出信号处理程序,怎么办? 进程的信号掩码是否发生变化? 在FreeBSD 5.2.1和Mac OS X 10.3下,setjmp和long jmp保存并恢复信号掩码。但是,Linux 2.4.22和Solaris 9不支持 这么做吧。FreeBSD和Mac OS X提供函数_setjmp和 _long_jmp,不保存和恢复信号掩码。 为了允许任何一种形式的行为,POSIX.1没有指定效果 信号面罩上的setjmp和long jmp。取而代之的是两个新函数, sigsetjmp和siglong jmp由POSIX.1定义。这两个函数 从信号处理程序进行分支时应始终使用。.
这些函数与setjmp和long jmp之间的唯一区别 函数的原因是sigsetjmp有一个额外的参数。如果avemask是 非零,则sigsetjmp还保存 在环境中处理。调用siglong jmp时,如果env参数为 通过使用非零存储掩码调用sigsetjmp保存,然后调用siglong jmp 还原保存的信号掩码。
这篇关于为什么在C中使用`sigsetjmp`而不是`setjmp`函数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文