訊號的阻塞

2021-07-24 17:32:31 字數 1909 閱讀 2904

訊號的阻塞就是讓系統暫時保留訊號留待以後傳送。(注意:不是不傳送,而是延遲傳送)一般情況下訊號的阻塞只是暫時的,只是為了防止訊號打斷敏感的操作。

1 訊號集

所有的訊號阻塞函式都使用稱作訊號集的資料結構來表明受到影響的訊號。每乙個操作都包括兩個階段:建立訊號集,傳遞訊號集給特定的庫函式。下面說明訊號集和相關的資料型別:

sigset_t:這個資料型別用來代表訊號的集合,有兩種方法對它進行初始化。一種是通過函式sigemptyset()使之不包含任何訊號,然後用 sigaddset()函式加入需要的訊號。另一種方法是通過函式sigfillset()使之包含所有訊號,然後通過sigdelset()函式刪除我們不需要的訊號。注意,千萬不用試圖通過手工方式直接操作這種型別變數,否則會帶來嚴重的錯誤。下面介紹相關的函式。

int sigemptyset(sigset_t *set):初始化訊號集set使之不包含任何訊號,這個函式總是返回0。

int sigfillset(sigset_t *set):初始化訊號集set使之包含所有的訊號,這個函式也是總返回0。

int sigaddset(sigset_t *set, int signum):該函式把訊號signum加入到訊號集set中,需要注意的是這個函式只是修改了set變數本身,並不作其它操作。該函式成功操作返回 0,失敗返回-1,錯誤**設定成einval,表示signum不是有效的訊號**。

int sigdelset(sigset_t *set, int signum):該函式從訊號集set中刪除訊號signum,其它方面和sigaddset()函式類似,不再贅述。

int sigismember(const sigset_t *set,int signum):這個函式測試訊號signum是否包含在訊號集合set中,如果包含返回1,不包含返回0,出錯返回-1。錯誤**也只有乙個 einval,表示signum不是有效的訊號**。

2. 程序的訊號掩碼

我們稱正在阻塞的訊號的集合為訊號掩碼(signal mask)。每個程序都有自己的訊號掩碼,建立子程序時子程序將繼承父程序的訊號掩碼。我們可以通過修改當前的訊號掩碼來改變訊號的阻塞情況。

int sigprocmask(int how, const sigset_t *set,sigset_t *oldset),該函式用來檢查和改變呼叫程序的訊號掩碼,其中的how引數指出訊號掩碼改變的方式,必須是下面的值之一:

sig_block,阻塞set中包含的訊號。意思是說把set中的訊號加到當前的訊號掩碼中去,新的訊號掩碼是set和舊訊號掩碼的並集。

sig_unblock,解除set中訊號的阻塞,從當前訊號掩碼中去除set中的訊號。

sig_setmask,設定訊號掩碼,既按照set中的訊號重新設定訊號掩碼。

最後乙個引數是程序原來的訊號集。如果你只需要改變訊號的阻塞情況而不需要關心原來的值,可以傳遞null指標給函式。如果你希望什麼也不改變,只是想獲得當前訊號掩碼的資訊,那麼把set設定成null,old中返回當前的設定。

sigprocmask()函式成功返回0,失敗返回-1。失敗時錯誤**只可能是einval,表示引數how不合法。

不能阻塞sigkill和sigstop等訊號,但是當set引數包含這些訊號時sigprocmask()不返回錯誤,只是忽略它們。另外,阻塞 sigfpe這樣的訊號可能導致不可挽回的結果,因為這些訊號是由程式錯誤產生的,忽略它們只能導致程式無法執行而被終止。

例子:#include

#include

#include

#include

int main()

return 0;

}這是在redhat5的測試效果

那個display all 2100 possibilities? (y or n)純屬截圖時按錯鍵,無視即可

訊號的阻塞

一.阻塞訊號 1.訊號的相關概念 1 遞達 實際執行訊號的處理動作稱為訊號的遞達 2 未決 訊號從產生到遞達之間的過程叫做訊號的未決 3 阻塞 程序可以選擇阻塞某個訊號,被阻塞的訊號產生時將保持在未決狀態,直到程序解除該訊號的遮蔽,才執行遞達動作.4 阻塞和忽略的不同 訊號被阻塞就不會被遞達,而訊號...

訊號的阻塞

每個訊號都有兩個標誌位分別表示阻塞block和未決pending 還有乙個函式指標表示處理動作。block與pending是兩個位圖,訊號產生時,核心在該程序控制塊中設定該訊號的未決標誌位,當訊號抵達時,才消除該訊號。posix.1允許遞送系統一次或多次該訊號,linux中,在常規訊號遞達之前產生多...

linux訊號 阻塞訊號

1.訊號在核心中的表示 我們知道了訊號產生的各種原因,而實際執行訊號處理的動作,叫做訊號遞達 delivery 訊號從產生到遞達之間的狀態,稱為訊號未決 pending 程序可以選擇阻塞 block 某個訊號。被阻塞的訊號產生時將保持在未決狀態,直到程序解除對此訊號的阻塞,才執行遞達的動作。注意,阻...