在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