sigprocmask()问题

时间:2011-04-16 18:27:02

标签: c linux signals

以下代码来自本书在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 */

1 个答案:

答案 0 :(得分:0)

使用sigsuspend是为了避免sigprocmask和pause之间的过程。如果你不需要在收到信号之前停止你的线程,那么sigsuspend就没有什么可以为你做的。您没有提供足够的信息来了解您的上下文中是否存在其他问题。