linux 訊號處理 三 (訊號集的使用)

2021-09-06 19:46:57 字數 2412 閱讀 1474

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 5

6static

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.被阻塞的訊號產生時將保持在未決狀態,知道程序解除對此訊號 的阻塞,才會執行遞...