在UNIX环境书高级编程下面的代码是,理查德·史蒂文斯sigprocmask()执行问题
而且这段代码书上说的;
“时如果被阻塞的信号被发送到该过程中,信号传送将被推迟,直到信号被解除阻塞。为了该应用程序,这可以看起来好像解封和暂停之间产生的信号(取决于内核如何实现信号),如果发生这种情况,或者信号确实发生在解除阻塞和暂停之间,我们就会遇到问题,在这个时间窗口中发生的任何信号都会丢失,因为我们可能会没有再次看到信号,在这种情况下,暂停将无限期阻止,这是早期不可靠信号的另一个问题。“
它recommands因为它复位信号复位掩模掩模信号代替pause()
之前使用sigsuspend()
,并把该过程在单个原子操作睡觉。但是我不希望我的过程等到信号从关键区域出来后才会出现。 那么这个问题也适用于我的情况吗?如果是这样,我应该用什么不要丢失信号,同时用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 */
你还没有真正清楚你的问题是什么。你有一个关键的代码区域?你的情况如何? – vy32 2011-04-16 18:36:52
我的代码类似于上面的代码,没有暂停(),但是其他我自己的函数。在两个sigprocmask()调用之间是我的关键区域像上面的代码,但在我的情况下,所有上面的代码是在一个while(1)循环。所以我希望我的信号处理程序只在程序执行超出关键区域并且信号(它是SIGALRM)被传送时才能工作。 – korhan 2011-04-16 18:51:37
在调用sigprocmask()来解锁信号之前,您可以使用sigpending()来查找未决信号,但这似乎有点矫枉过正。 – ydroneaud 2011-07-06 10:14:10