linux信号掩码线程,20.10 信号掩码(阻塞信号传递)
20.10? 信號掩碼(阻塞信號傳遞)
內核會為每個進程維護一個信號掩碼,即一組信號,并將阻塞其針對該進程的傳遞。如果將遭阻塞的信號發送給某進程,那么對該信號的傳遞將延后,直至從進程信號掩碼中移除該信號,從而解除阻塞為止。(由33.2.1節可知,信號掩碼實際屬于線程屬性,在多線程進程中,每個線程都可使用pthread_sigmask()函數來獨立檢查和修改其信號掩碼。)
向信號掩碼中添加一個信號,有如下幾種方式。
當調用信號處理器程序時,可將引發調用的信號自動添加到信號掩碼中。是否發生這一情況,要視sigaction()函數在安裝信號處理器程序時所使用的標志而定。
使用sigaction()函數建立信號處理器程序時,可以指定一組額外信號,當調用該處理器程序時會將其阻塞。
使用sigprocmask()系統調用,隨時可以顯式向信號掩碼中添加或移除信號。
對前兩種情況的討論將推遲到 20.13 節對sigaction()函數的介紹之后,現在先來討論sigprocmask()函數。
使用sigprocmask()函數既可修改進程的信號掩碼,又可獲取現有掩碼,或者兩重功效兼具。how參數指定了sigprocmask()函數想給信號掩碼帶來的變化。
SIG_BLOCK
將set指向信號集內的指定信號添加到信號掩碼中。換言之,將信號掩碼設置為其當前值和set的并集。
SIG_UNBLOCK
將set指向信號集中的信號從信號掩碼中移除。即使要解除阻塞的信號當前并未處于阻塞狀態,也不會返回錯誤。
SIG_SETMASK
將set指向的信號集賦給信號掩碼。
上述各種情況下,若oldset參數不為空,則其指向一個sigset_t結構緩沖區,用于返回之前的信號掩碼。
如果想獲取信號掩碼而又對其不作改動,那么可將set參數指定為空,這時將忽略how參數。
要想暫時阻止信號的傳遞,可以使用程序清單20-5中所示的一系列調用來阻塞信號,然后再將信號掩碼重置為先前的狀態以解除對信號的鎖定。
程序清單20-5:暫時阻塞信號傳遞
SUSv3規定,如果有任何等待信號因對sigprocmask()的調用而解除了鎖定,那么在此調用返回前至少會傳遞一個信號。換言之,如果解除了對某個等待信號的鎖定,那么會立刻將該信號傳遞給進程。
系統將忽略試圖阻塞SIGKILL和SIGSTOP信號的請求。如果試圖阻塞這些信號,sigprocmask()函數既不會予以關注,也不會產生錯誤。這意味著,可以使用如下代碼來阻塞除SIGKILL和SIGSTOP之外的所有信號:
【責任編輯:book TEL:(010)68476606】
點贊 0
總結
以上是生活随笔為你收集整理的linux信号掩码线程,20.10 信号掩码(阻塞信号传递)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux下的代码比较工具下载,linu
- 下一篇: 浪潮linux网卡驱动,浪潮NF5280