訊號掩碼 – 被阻塞的訊號集
每個程序都有乙個用來描述哪些訊號傳送來將被阻塞的訊號集,如果某種訊號在某個程序的阻塞訊號集中,則傳送到該程序的此種訊號將會被阻塞。當前被程序阻塞的訊號集也叫訊號掩碼,型別為sigset_t。每個程序都有自己的訊號掩碼,且建立子程序時,子程序會繼承父程序的訊號掩碼。
訊號阻塞和忽略的區別
阻塞的概念與忽略訊號是不同的:作業系統在訊號被程序解除阻塞之前不會將訊號傳遞出去,被阻塞的訊號也不會影響程序的行為,訊號只是暫時被阻止傳遞;當程序忽略乙個訊號時,訊號會被傳遞出去,但程序將訊號丟棄。
訊號集的操作
int sigemptyset(sigset_t *set); //清空訊號集
int sigfillset(sigset_t *set); //將所有訊號填充進 訊號集set 中
int sigaddset(sigset_t *set, int signum); //往訊號集 set 中新增訊號 signum
int sigdelset(sigset_t *set, int signum); //往訊號集 set 中移出訊號 signum
//以上四個函式返回:若成功則為0,若出錯則為-1
int sigismember(const sigset_t *set, int signum); //判斷 signum 是不是包含在set 中,在返回 1,不在返回 0.
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset); //設定對訊號遮蔽集內的訊號的處理方式(阻塞或不阻塞)
引數說明:
how : 用於指定訊號修改的方式,可能選擇有3種
sig_block 將 set 所指向的訊號集合中包含的訊號加到當前的訊號掩碼中.即訊號掩碼與 set 訊號集進行或操作.
sig_unblock 將 set 所指向的訊號集中包含的訊號從當前的訊號掩碼中刪除.即訊號掩碼和set進行與操作。
sig_setmask 將set的值設定為新的程序訊號掩碼。即set對訊號掩碼進行了賦值操作。
set : 為指向訊號集的指標,在此專指新設的訊號集,如果僅想讀取現在的遮蔽值,可將其置為null。
oldset : 也是指向訊號集的指標,在此存放原來的訊號集。可用來檢測訊號掩碼中存在什麼訊號。
返回值:成功執行時,返回0。失敗返回-1,errno被設為einval。
Linux訊號集相關函式操作
在linux的程序中可以接收到各種的訊號,並且如果你不對訊號進行處理,linux中的程序就會採用預設的處理方式處理,比如ctrl c的訊號,程序對它的處理就是終止程序的執行。在linux中,我們也可以在程序中遮蔽掉某些訊號,使程序不去處理這些訊號,但其中的sigkill和sigstop是不能被阻塞的...
Linux 訊號的處理以及訊號集操作函式
首先來再次看看這張圖 從上圖來看,每個訊號只有乙個bit的未決標誌,非0即1,不記錄該訊號產生了多少次,阻塞標誌也是這樣表示的。因此,未決和阻塞標誌可以用相同的資料型別sigset t來儲存,sigset t稱為訊號集,這個型別可以表示每個訊號的 有效 或 無效 狀態,在阻塞訊號集中 有效 和 無效...
訊號(六)訊號集操作函式
一 核心通過讀取未決訊號集來判斷訊號是否應該被處理。訊號遮蔽字mask可以影響未決訊號集。為我們可以在應用程式中自定義set來改變mask,來達到遮蔽指定訊號的目的。二 訊號集設定 sigset t set typedef unsigned long sigset t int sigemptyset...