2011-04-16 44 views
1

在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 */ 
+0

你还没有真正清楚你的问题是什么。你有一个关键的代码区域?你的情况如何? – vy32 2011-04-16 18:36:52

+0

我的代码类似于上面的代码,没有暂停(),但是其他我自己的函数。在两个sigprocmask()调用之间是我的关键区域像上面的代码,但在我的情况下,所有上面的代码是在一个while(1)循环。所以我希望我的信号处理程序只在程序执行超出关键区域并且信号(它是SIGALRM)被传送时才能工作。 – korhan 2011-04-16 18:51:37

+0

在调用sigprocmask()来解锁信号之前,您可以使用sigpending()来查找未决信号,但这似乎有点矫枉过正。 – ydroneaud 2011-07-06 10:14:10

回答

0

sigsuspend用于避免sigprocmask和暂停之间的过程。如果在收到信号之前不需要停止线程,则sigsuspend可以为您做任何事情。您没有提供足够的信息来了解您的情况下是否存在其他问题。