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

Cha*_*dru 7 c signals

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

当我从书中提到它时,在使用带信号的setjmp时它有一些缺点,因此它们实现了sigsetjmp函数.

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

提前致谢.

pau*_*sm4 12

请参见"UNIX®环境中的高级编程"中的第10.15节:

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

但是,调用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对信号掩码的影响.相反,POSIX.1定义了两个新函数sigsetjmp和siglongjmp.从信号处理程序分支时,应始终使用这两个函数.

...

这些函数与setjmp和longjmp函数之间的唯一区别是sigsetjmp有一个额外的参数.如果savemask非零,则sigsetjmp还会在env中保存进程的当前信号掩码.当调用siglongjmp时,如果通过使用非零保存掩码调用sigsetjmp来保存env参数,则siglongjmp将恢复保存的信号掩码.