为什么在C中使用`sigsetjmp`而不是`setjmp`函数? [英] Why use `sigsetjmp` instead of `setjmp` function in C?

查看:10
本文介绍了为什么在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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆