2011-04-16 72 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可以爲您做任何事情。您沒有提供足夠的信息來了解您的情況下是否存在其他問題。