为什么sigsuspend要与sigprocmask配合使用?
2010-09-13 09:40
369 查看
apue示例代码:
sigemptyset(&new_mask);
sigemptyset(&zero_mask); // 清空信号集zero_mask
sigaddset(&new_mask, SIGQUIT);
sigprocmask(SIG_BLOCK, &new_mask, &old_mask); // 阻塞SIGQUIT
while( quitflag == 0 )
{
sigsuspend(&zero_mask); // 将信号掩码替换为空,等待SIGQUIT信号处理函数将quitflag置1
}
sigprocmask(SIG_SETMASK, &old_mask, NULL); // 恢复信号掩码
为什么sigsuspend要与sigprocmask配合使用?
是为了原子操作
如果之前没有调用sigprocmask()屏蔽SIGQUIT信号,那么SIGQUIT信号随时都能发生
假定恰恰在判断quitflag == 0之后,信号发生,调用信号处理程序,quitflag = 1
从信号处理程序返回后,开始调用sigsuspend()..
如果此后没有第二个SIGQUIT信号,那么程序将一直阻塞在sigsuspend(),虽然此时quitflag = 1
调用sigprocmask()屏蔽SIGQUIT信号之后,即使信号发生,也将延迟递交,直到sigsuspend()解除信号屏蔽。
sigemptyset(&new_mask);
sigemptyset(&zero_mask); // 清空信号集zero_mask
sigaddset(&new_mask, SIGQUIT);
sigprocmask(SIG_BLOCK, &new_mask, &old_mask); // 阻塞SIGQUIT
while( quitflag == 0 )
{
sigsuspend(&zero_mask); // 将信号掩码替换为空,等待SIGQUIT信号处理函数将quitflag置1
}
sigprocmask(SIG_SETMASK, &old_mask, NULL); // 恢复信号掩码
为什么sigsuspend要与sigprocmask配合使用?
是为了原子操作
如果之前没有调用sigprocmask()屏蔽SIGQUIT信号,那么SIGQUIT信号随时都能发生
假定恰恰在判断quitflag == 0之后,信号发生,调用信号处理程序,quitflag = 1
从信号处理程序返回后,开始调用sigsuspend()..
如果此后没有第二个SIGQUIT信号,那么程序将一直阻塞在sigsuspend(),虽然此时quitflag = 1
调用sigprocmask()屏蔽SIGQUIT信号之后,即使信号发生,也将延迟递交,直到sigsuspend()解除信号屏蔽。
相关文章推荐
- 为什么sigsuspend要与sigprocmask配合使用?
- 函数sigsuspend sigprocmask的使用
- 使用sigprocmask遇到的问题,记录下
- sigprocmask函数使用精要
- linux学习---信号(signal,sigaction,kill,sigqueue,sigprocmask,sigpending,sigsuspend)
- Linux信号控制-sigprocmask,sigsuspend,sigpending,sigaction,sigqueue
- Linux进程间通信(二):信号集函数 sigemptyset()、sigprocmask()、sigpending()、sigsuspend()
- sigsuspend sigprocmask函数的用法
- linux 信号量sigprocmask使用
- Linux sigsuspend与sigprocmask使用详解
- sigprocmask, sigpending, sigsuspend的用法
- 10 对sigprocmask,sleep 函数的理解(sigsuspend)
- sigemptyset、sigaddset、sigprocmask的用法
- sigemptyset、sigaddset、sigprocmask的用法
- sigprocmask理解
- sigprocmask()函数解释
- sigprocmask函数总结
- sigprocmask和信号阻塞
- sigprocmask
- 信号相关函数(signal,sigaction,sigprocmask, kill,sigqueue信号发送函数,睡眠函数,计时器函数)