任何人都可以解释为什么sigsetjmp函数正在使用而不是setjmp函数。
当我从书中提到它时,将setjmp与信号一起使用有一些缺点,以便它们实现sigsetjmp函数。
任何人都可以用例子解释这个。
先谢谢。
答案 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 恢复保存的信号掩码。