訊號的遮蔽和安裝

2021-10-18 21:26:26 字數 3192 閱讀 3226

參見訊號的的介紹

sigkillsigdtop訊號外。其他的訊號都可以被遮蔽或者忽略。

參見訊號的捕獲處理

訊號集,顧名思義所有訊號的集合。在linux下訊號的集合是sigset_t型別的變數,該型別的定義為unsigned long int的,該型別在gcc(posix系統以及cygwin)下為8位元組。而linux下一共64個訊號,這代表著每個訊號佔一位(1bit)。當該訊號集的第乙個bit為1時,表示1號訊號處於未決態(被遮蔽準確不應該這麼叫),為0時表示1號訊號未處於未決態(未被遮蔽)。

訊號集的本質是點陣圖,我們在操作訊號集的時候不應該直接使用位操作,而是用響應的api操作,保證程式跨平台的有效。

(1)將某個訊號集清0

int

sigemptyset

(sigset_t *set)

;成功:0

失敗:-

1

(2)將某個訊號集置1
int

sigfillset

(sigset_t *set)

;成功:0

失敗:-

1

(3)將某個訊號加入到訊號集
int

sigaddset

(sigset_t *set,

int signum)

; 成功:0

失敗:-

1

(4)將某個訊號從訊號集清除
int

sigdelset

(sigset_t *set,

int signum)

; 成功:0

失敗:-

1

(5)判斷某個訊號是否在訊號集中
int

sigismember

(const sigset_t *set,

int signum)

;在:1 不在: 0出錯:-

1

(6)設定程序遮蔽訊號集

用來遮蔽/解除遮蔽位於程序pcb中的訊號集合

int

sigprocmask

(int how,

const sigset_t *set, sigset_t *oldset)

;假設當前的訊號集合為currmask

how引數的取值:

sig_block:表示將set訊號集合新增到當前程序遮蔽的訊號集中,相當於currmask=currmask|set

sig_unblock:表示將set訊號集合從當前程序遮蔽的訊號集中刪除,相當於currmask = currmask&

~set

sig_setmask:表示用set替代原來的遮蔽訊號集

set:表示當前要設定的遮蔽的訊號集

oldset:表示設定前的遮蔽的訊號集

(7)獲取當前程序未決訊號集

任何傳送給程序沒有**獲的訊號成為未決訊號,這裡包含沒來得及處理(正在處理其他訊號)訊號和因程序暫時遮蔽了這和訊號而導致的未決。

int

sigpending

(sigset_t *set)

;傳出當前的未決訊號集,該訊號集的那個bit位為1,表示那個訊號被遮蔽。

返回值:成功:0;失敗:-

1

(1)示例一:

在下面的示例中,遮蔽3號訊號sigquit(該訊號由鍵盤ctrl+/產生),遮蔽2號訊號sigint(該訊號由鍵盤ctrl+c產生),遮蔽19號訊號sigtstp(該訊號由鍵盤ctrl+z產生),並且驗證是否能遮蔽9號訊號sigkill(該訊號通過kill -9傳送產生)

#include

#include

#include

void

printsigset

(sigset_t *set)

printf

("\n");

}int

main

(int argc,

char

const

*ar**)

//獲取當前未決訊號集

sigpending

(&oldset)

;printsigset

(&oldset)

;//設定當前程序的遮蔽訊號集

sigprocmask

(sig_block,

&myset,

&oldset)

;sleep(9

);while(1

)return0;

}

上面結果表明,當某個訊號被事先加入到程序的遮蔽訊號集中後。當該訊號產生時,程序的未決訊號集的相應位會被置1,同時該訊號就會處於未決態。而當程序的訊號集發生變化後(例如將該訊號從程序的遮蔽訊號集中剔除)後,剛處於未決態的訊號就會被啟用,繼續執行該訊號的動作。看下面的示例二

(1)示例二:

先將ctrl+c產生的2號訊號加入到遮蔽訊號集中,在程式執行後的1秒時按下ctrl+c 產生sigint 訊號2。此時訊號2並不能讓程序結束,因為該訊號處於未決態。4秒後程式執行到if語句中。將2號訊號從程序的遮蔽訊號集中剔除。此時剛剛處於未決態的訊號2就會被啟用,執行相應的訊號處理函式。而訊號2預設處理就是結束程序,因此程序自動結束 printf(「結束了\n」); 這行**還未執行就結束了。

#include

#include

#include

#include

void

printsigset

(sigset_t *set)

printf

("\n");

}int

main

(int argc,

char

const

*ar**)

//設定當前程序的遮蔽訊號集

sigprocmask

(sig_block,

&myset,

&oldset)

;while(1

)}return0;

}

訊號遮蔽字

訊號遮蔽字是指乙個程序中當前阻塞而不能夠遞送給該程序的訊號集。訊號集則是乙個能表示多個訊號的集合的一種資料型別,為sigset t。與訊號集設定相關的函式有如下幾個 cpp view plain copy font size 18px include 下列四個函式成功返回0,出錯返回 1 int s...

linux 訊號遮蔽

include include include include include include sigemptyset newmask 獲取空遮蔽訊號集 sigfillset newmask 獲取遮蔽了所有訊號的遮蔽訊號集,除了那兩個sigkill sigstop sigpending pendma...

訊號遮蔽pending

實際執 行訊號的處理動作稱為訊號遞 達 delivery 實際的處理方式有三種。1 忽略帶訊號 2 預設處理動作 3 自定義處理動作 訊號從產 生到遞達之間的狀態,稱為訊號未決 pending 程序可以選擇阻塞 block 某個訊號。被阻塞的訊號產 生時將保持在未決狀態,直到程序解除對此訊號的阻塞,...