以下代码来自本书在unix环境中的高级编程,W。Richard Stevens
关于这本代码本说;
“如果信号在被阻止时被发送到进程,则信号传递将推迟到信号被解除阻塞。对于应用程序,这看起来好像信号发生在解除阻塞和暂停之间(取决于内核如何实现信号)。如果发生这种情况,或者如果信号确实发生在解锁和暂停之间,我们就会遇到问题。在这个时间窗口中出现的任何信号都会丢失,因为我们可能看不到再次发出信号,在这种情况下,暂停将无限期地阻塞。这是早期不可靠信号的另一个问题。“
它建议在重置信号掩码之前使用sigsuspend()
而不是pause()
,因为它会重置信号掩码并使进程在单个原子操作中进入休眠状态。但我不希望我的过程等到踩出关键区域后发出信号。 这个问题也适用于我的情况吗?如果是这样,我应该使用sigprocmask()
重置信号掩码时不丢失信号?
sigset_t newmask, oldmask;
sigemptyset(&newmask);
sigaddset(&newmask, SIGINT);
/* block SIGINT and save current signal mask */
if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)
err_sys("SIG_BLOCK error");
/* critical region of code */
/* reset signal mask, which unblocks SIGINT */
if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)
err_sys("SIG_SETMASK error");
/* window is open */
pause(); /* wait for signal to occur */
/* continue processing */
答案 0 :(得分:0)
使用sigsuspend是为了避免sigprocmask和pause之间的过程。如果你不需要在收到信号之前停止你的线程,那么sigsuspend就没有什么可以为你做的。您没有提供足够的信息来了解您的上下文中是否存在其他问题。