sigprocmask系統呼叫
使用條件:
1、有時候不希望在接到訊號時就立即停止當前執行,去處理訊號,同時也不希望忽略該訊號,而是延時一段時間去呼叫訊號處理函式。這種情況是通過阻塞訊號實現的。
2、訊號阻塞和忽略訊號的區別。
阻塞的概念和忽略訊號是不同的。作業系統在訊號被程序解除阻塞之前不會講訊號傳遞出去,被阻塞的訊號也不會影響程序的行為,訊號只是暫時被阻止傳遞。當程序忽略乙個訊號時,訊號會被傳遞出去但程序會將訊號丟棄。
3、訊號阻塞系統呼叫,它們的都起到阻塞的作用,它們不是協作使用的。
功能描述:
設定對訊號遮蔽集內的訊號的處理方式(阻塞或不阻塞)。
用法:
#include
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
引數:how:用於指定訊號修改的方式,可能選擇有三種
sig_block //將set所指向的訊號集中包含的訊號加到當前的訊號掩碼中。即訊號掩碼和set訊號集進行或操作。
sig_unblock //將set所指向的訊號集中包含的訊號從當前的訊號掩碼中刪除。即訊號掩碼和set進行與操作。
sig_setmask //將set的值設定為新的程序訊號掩碼。即set對訊號掩碼進行了賦值操作。
set:為指向訊號集的指標,在此專指新設的訊號集,如果僅想讀取現在的遮蔽值,可將其置為null。
oldset:也是指向訊號集的指標,在此存放原來的訊號集。可用來檢測訊號掩碼中存在什麼訊號。
返回說明:
成功執行時,返回0。失敗返回-1,errno被設為einval。
1 #include 2 #include 3 #include 4 #include 56static
void sig_int(int
signo)
715 signal(sigquit, sig_dfl);//
將sigquit的動作設為預設值16}
17int
main()
1843
44//
檢查哪些訊號是懸而未決的
45 sigpending(&pendmask);
4647
//檢查sigquit是否懸而未決的。所謂懸而未決
,是指sigquit被阻塞還沒
有被處理
48if (sigismember(&pendmask, sigquit))
4952
53//
恢復被遮蔽的訊號sigquit
54 sigprocmask(sig_setmask, &oldmask, null);
5556
/**開始處理訊號,呼叫訊號處理函式
*/57 printf("
sigquit unblocked\n");
5859 sleep(5);//
再次休眠5秒鐘
6061
return (0
);62
63 }
所謂阻塞時間為:「sigprocmask(sig_block, &newmask, &oldmask)」設定阻塞到「sigprocmask(sig_setmask, &oldmask, null)」解除阻塞的整個時間,當然這期間發生了訊號處理函式,也將阻塞訊號集中的訊號。
以上示例是linux redhat,
執行結果是
$./a.out
sigprocmask sigquit finish //訊號集新增了「sigquit 」訊號
block 0
^ccaught sigquit //發生了訊號處理函式
signal handle 0
signal handle 1
^\signal handle 2 //訊號處理函式過程中訊號集中的訊號仍然阻塞
signal handle 3
signal handle 4
signal handle 5
block 1
^\block 2 //訊號集中的訊號阻塞
block 3
block 4
block 5
sigquit pending
退出 (核心已轉儲)
【sigpending系統呼叫】
#include
int sigpending(sigset_t *set);
sigpending函式返回訊號集,其中的各個訊號對於呼叫程序是堵塞的而不能遞送,因而也一定是未決的。該訊號集通過set引數返回。
Linux 訊號的處理以及訊號集操作函式
首先來再次看看這張圖 從上圖來看,每個訊號只有乙個bit的未決標誌,非0即1,不記錄該訊號產生了多少次,阻塞標誌也是這樣表示的。因此,未決和阻塞標誌可以用相同的資料型別sigset t來儲存,sigset t稱為訊號集,這個型別可以表示每個訊號的 有效 或 無效 狀態,在阻塞訊號集中 有效 和 無效...
Linux 訊號的理解以及訊號集處理函式的使用
通過終端按鍵產生。如ctrl c 終止程序 通過系統函式向程序傳送訊號。如kill 函式,給指定程序傳送訊號。有軟體條件產生訊號。如alarm 函式,設定乙個鬧鐘訊號。硬體異常。如記憶體越界,除0異常。傳送訊號給程序 include include int kill pid t pid,int si...
Linux程序訊號 訊號處理
一 訊號相關概念 1.實際執行訊號的處理動作稱為訊號遞達 delivery 2.訊號從產生到遞達之間的狀態稱為訊號未決 pending 不一定會立即delivery 3.程序可以選擇阻塞 block 某個訊號。不會遞達 4.被阻塞的訊號產生時將保持在未決狀態,知道程序解除對此訊號 的阻塞,才會執行遞...