-
直接转换方法:将sigsuspend函数的数据流图转化为模块结构图
资源介绍
10.16 sigsuspend函数
上面已经说明,更改进程的信号屏蔽字可以阻塞或解除阻塞所选择的信号。使用这种技术
可以保护不希望由信号中断的代码临界区。如果希望对一个信号解除阻塞,然后 p a u s e以等待以
前被阻塞的信号发生,则又将如何呢? 假定信号是S I G I N T,实现这一点的一种不正确的方法是:
如果在解除对S I G I N T的阻塞和p a u s e之间发生了S I G I N T信号,则此信号被丢失。这是早期
的不可靠信号机制的另一个问题。
为了纠正此问题,需要在一个原子操作中实现恢复信号屏蔽字,然后使进程睡眠,这种功
能是由s i g s u s p e n d函数所提供的。
#include
int sigsuspend(const sigset_t *s i g m a s k) ;
返回:-1, errno设置为E I N T R
进程的信号屏蔽字设置为由 s i g m a s k指向的值。在捕捉到一个信号或发生了一个会终止该进程
的信号之前,该进程也被挂起。如果捕捉到一个信号而且从该信号处理程序返回,则
s i g s u s p e n d返回,并且该进程的信号屏蔽字设置为调用 s i g s u s p e n d之前的值。
注意,此函数没有成功返回值。如果它返回到调用者,则总是返回- 1,并且e r r n o设置为
E I N T R (表示一个被中断的系统调用)。
实例
程序1 0 - 1 5显示了保护临界区,使其不被指定的信号中断的正确方法。
程序10-15 保护临界区不被信号中断
第 1 0章 信 号 2 2 9
- 上一篇: 跳转执行-故障注入测试
- 下一篇: 强制调用函数-故障注入测试