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