【问题标题】:Why use `sigsetjmp` instead of `setjmp` function in C?为什么在 C 中使用 `sigsetjmp` 而不是 `setjmp` 函数?
【发布时间】:2014-01-12 08:43:54
【问题描述】:

为什么有人会选择在 C 中使用 sigsetjmp 而不是 setjmp

我在一本书中看到,使用setjmp与信号相关的代码有一些缺点,所以实现了sigsetjmp函数。

谁能举个例子解释一下?

提前致谢。

【问题讨论】:

  • 问题很明确,而且答案也足够客观,可以在网站上存在。我建议重新打开

标签: c signals


【解决方案1】:

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 有一个附加参数。如果保存掩码是 非零,则 sigsetjmp 也保存当前的信号掩码 环境中的过程。调用 siglongjmp 时,如果 env 参数是 通过使用非零保存掩码调用 sigsetjmp 保存,然后使用 siglongjmp 恢复保存的信号掩码。

【讨论】:

    猜你喜欢
    • 2016-10-06
    • 2014-04-29
    • 1970-01-01
    • 2021-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多