sigaction()之sa_mask

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處理完後才被遞送;
  • 如果連續產生了多次信號,當信號解除阻塞後,信號處理函數只執行一次。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章