在這裡我們先列出這些訊號集操作函式,它們是:
int sigemptyset(sigset_t *set);
int sigfillset(sigset_t *set);
int sigaddset(sigset_t *set, int signo);
int sigdelset(sigset_t *set, int signo);
int sigismember(const sigset_t *set, int signo);
int sigprocmask(int how, const sigset_t *set, sigset_t *oset);
其中,signo是訊號標誌,我們可以用 kill -l檢視,其中32-64為實時訊號,這裡先不討論。
此外,sigset_t是一種結構體,sigset_t型別對於每種訊號⽤用⼀個bit表⽰示「有效」或「無效」狀態,至於怎麼實現,我們作為使用者無須在意,其定義在/usr/include/bits/sigeset.h
函式sigemptyset初始化set所指向的訊號集,使其中所有訊號的對應bit清零,表示該訊號集不包含任何有效訊號。函式sigfillset初始化set所指向的訊號集,使其中所有訊號的對應bit置位,表示 該訊號集的有效訊號包括系統⽀支援的所有訊號。
**注意,在使⽤用sigset_t型別的變數之前,一定要調 sigemptyset或sigfillset做初始化,使訊號集處於確定的狀
態**
兩個函式都是成功返回0,出錯返回-1。
2,int sigaddset(sigset_t *set, int signo);
int sigdelset(sigset_t *set, int signo);
我們在初始化sigset_t變數之後就可以 在呼叫sigaddset和sigdelset在該訊號集中新增或刪除某種有效訊號。兩個函式都是成功返回0,出錯返回-1。
int sigismember(const sigset_t *set, int signo);
sigismember函式是乙個布林函式,⽤用於判斷乙個訊號集的有效訊號中是否包含某種 訊號,若包含則返回1,不包含則返回0,出錯返回-1。
4,int sigprocmask(int how, const sigset_t *set, sigset_t *oset);
呼叫函式sigprocmask可以讀取或更改程序的訊號遮蔽字(阻塞訊號集)。
如果oset是非空指標,則讀取程序的當前訊號遮蔽字通過oset引數傳出。如果set是非空指標,則 更改程序的訊號遮蔽字,引數how指示如何更改。如果oset和set都是非空指標,則先將原來的訊號 遮蔽字備份到oset⾥裡,然後根據set和how引數更改訊號遮蔽字。
how引數可為以下值:
sig_block: set裡面包含了我們想新增進遮蔽集裡的訊號。即mask = set | mask
sig_unblock: set裡面包含了我們去掉的訊號。
即mask = ~set & mask
sig_setmask:讓當前訊號遮蔽字與set相等
即mask = set
(mask 為當前訊號遮蔽集)。
函式若成功則為0,若出錯則為-1。
簡單示例:
我們把乙個訊號(下面新增的是sig_int,即ctrl +c)新增到當前程序的遮蔽訊號集裡,這樣我們傳送的訊號sig_int就不會被遞達,而一直在未決訊號集裡,但是當計數器到達乙個時限時,我們將訊號遮蔽字變為原來的狀態,未決訊號集裡的訊號即可遞達,程式終止。
訊號(六)訊號集操作函式
一 核心通過讀取未決訊號集來判斷訊號是否應該被處理。訊號遮蔽字mask可以影響未決訊號集。為我們可以在應用程式中自定義set來改變mask,來達到遮蔽指定訊號的目的。二 訊號集設定 sigset t set typedef unsigned long sigset t int sigemptyset...
Linux 訊號的處理以及訊號集操作函式
首先來再次看看這張圖 從上圖來看,每個訊號只有乙個bit的未決標誌,非0即1,不記錄該訊號產生了多少次,阻塞標誌也是這樣表示的。因此,未決和阻塞標誌可以用相同的資料型別sigset t來儲存,sigset t稱為訊號集,這個型別可以表示每個訊號的 有效 或 無效 狀態,在阻塞訊號集中 有效 和 無效...
Linux訊號集相關函式操作
在linux的程序中可以接收到各種的訊號,並且如果你不對訊號進行處理,linux中的程序就會採用預設的處理方式處理,比如ctrl c的訊號,程序對它的處理就是終止程序的執行。在linux中,我們也可以在程序中遮蔽掉某些訊號,使程序不去處理這些訊號,但其中的sigkill和sigstop是不能被阻塞的...