2016-03-07 128 views
0

書「高級編程在Unix環境」說:信號隊列和信號屏蔽

內核,除非他們支持實時擴展到POSIX.1

如果不排隊信號被阻塞的信號不止一次產生(產生的阻塞信號是不同類型的),它被設置在信號掩碼上。然後,在其他信號之前傳送與當前進程狀態相關的信號。

這裏,信號隊列和信號掩碼有什麼不同? 如果爲每種不同類型設置信號掩碼,這意味着內核知道什麼信號正在等待(因此,我認爲隊列和掩碼相同)。

而且,傳送信號一次?當同一類型的信號被多次傳送時,是不是這樣?另外,大多數UNIX系統不排隊信號意味着只有1個信號掩碼位可以在清除掩碼上設置?那麼,如果在這個過程中阻塞了不同類型的許多信號會發生什麼?什麼信號沒有設置?

+0

沒有隊列。信號有待處理或未處理。一點。如果有一個隊列,可以在其中放入5個SIGINT實例,這與6或17個實例不同。 –

+0

只能打開一個掩碼位? –

+0

不,可以打開幾個位。 –

回答

1

Signal Mask: 當前被收集的信號被封鎖被稱爲信號掩碼。一個進程可以設置一個信號掩碼來告訴內核它不想接收某些特定的信號。因此,發送其中一個阻塞信號意味着相應的信號處理程序不會被調用。 SIGKILLSIGSTOP信號不能被阻止。

Signal Queue:每個進程維護一個已接收但尚未處理的信號隊列。已使用掩碼阻止的信號將排隊等候。該過程可以通過sigwait(),sigwaitinfo()和類似功能訪問此隊列。