簡單常用的訊號集操作函式

2021-07-27 10:17:15 字數 2160 閱讀 6064

在這裡我們先列出這些訊號集操作函式,它們是:

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是不能被阻塞的...