sigset_t sa_mask是一個信號集,在調用該信號捕捉函數之前,將需要block的信號加入這個sa_mask,僅當信號捕捉函數正在執行時,才阻塞sa_mask中的信號,當從信號捕捉函數返回時進程的信號屏蔽字復位爲原先值;
這個復位動作是sigaction函數內部處理,還是由調用者自己處理呢?
由sigaction函數自動復位,不用自己處理。
設置sa_mask的目的
在調用信號處理函數時就能阻塞某些信號,注意僅僅是在信號處理函數正在執行時才能阻塞某些信號,如果信號處理程序執行完了,那麼依然能接收到這些信號;
在信號處理函數被調用時,操作系統建立的新信號屏蔽字包括正被遞送的信號,也就是說自己也被阻塞,除非設置SA_NODEFER。
因此保證了在處理一個給定信號時,如果這個信號在此發生,通常不會將它們排隊,如果在某種信號被阻塞時它發生了5次,那麼對這種信號解除了阻塞後,其信號處理函數通常只會被調用一次;
對於不同信號,當信號A被捕捉到並信號A的handler正被調用時,信號B產生了,
- 如果信號B沒有被阻塞,那麼正常接收信號B並調用自己的信號處理程序。另外,如果信號A的信號處理程序中有sleep函數,那麼當進程接收到信號B並處理完後,sleep函數立即返回(如果睡眠時間足夠長的話)
- 如果信號B有被設置成阻塞,那麼信號B被阻塞,直到信號A的信號處理程序結束,信號B才被接收並執行信號B的信號處理程序。
- 如果在信號A的信號處理程序正在執行時,信號B連續發生了多次,那麼當信號B的阻塞解除後,信號B的信號處理程序只執行一次。
- 如果信號A的信號處理程序沒有執行或已經執行完,信號B不會被阻塞,正常接收並執行信號B的信號處理程序。
對於相同信號,當一個信號A被捕捉到並信號A的handler正被調用時,
- 又產生了一個信號A,第二次產生的信號被阻塞,直到第一次產生的信號A處理完後才被遞送;
- 如果連續產生了多次信號,當信號解除阻塞後,信號處理函數只執行一次。