解析Linux訊號集操作函式
導讀 | 先來回顧一下未決訊號集是怎麼回事。訊號從產生到抵達目的地,叫作訊號遞達。而訊號從產生到遞達的中間狀態,叫作訊號的未決狀態。產生未決狀態的原因有可能是訊號受到阻塞了,也就是訊號遮蔽字(或稱阻塞訊號集,mask)對應位被置1。阻塞訊號集和未決訊號集均是由核心維護的,整個過程如下圖示: |
我們有時需要遮蔽某個訊號,就需要去修改阻塞訊號集。那麼,我們該如何修改阻塞訊號集?系統提供的一個方法是,我們先建立一個跟阻塞訊號集一樣的集合,再利用它去修改阻塞訊號集。
系統提供了一系列的訊號集設定函式。這些函式如下所示:
sigset_t set; 訊號集資料型別,本質是typedef unsigned long sigset_t; int sigemptyset(sigset_t *set); 將某個訊號集清0 int sigfillset(sigset_t *set); 將某個訊號集置1 int sigaddset(sigset_t *set, int signum); 將某個訊號加入訊號集 int sigdelset(sigset_t *set, int signum); 將某個訊號清出訊號集 以上幾個函式返回值均是:成功:0;失敗:-1 int sigismember(const sigset_t *set, int signum); 判斷某個訊號是否在訊號集中 返回值:在集合:1;不在:0;出錯:-1
使用以上這些函式建立完訊號集後,要如何去改變阻塞訊號集呢?系統又提供了一個函式:sigprocmask函式。sigprocmask函式可以用來遮蔽訊號,也可以用來解除遮蔽訊號,其本質就是利用我們建立的訊號集去改變阻塞訊號集。
函式原型:
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
返回值:
成功:0;失敗:-1,設定errno
引數解釋:
set:傳入引數,是一個點陣圖,set中哪位置1,就表示當前程式遮蔽哪個訊號。
oldset:傳出引數,儲存舊的訊號遮蔽集。這個與setitimer有點相似。
how引數取值:
假設當前的訊號遮蔽字為mask
1.SIG_BLOCK:當how設定為此值,set表示需要遮蔽的訊號。相當於 mask = mask | set
2.SIG_UNBLOCK:當how設定為此,set表示需要解除遮蔽的訊號。相當於 mask = mask & ~set
3.SIG_SETMASK:當how設定為此,set表示用於替代原始遮蔽及的新遮蔽集。相當於 mask = set若,呼叫sigprocmask解除了對當前若干個訊號的阻塞,則在sigprocmask返回前,至少將其中一個訊號遞達。
我們如何讀取未決訊號集?系統提供了sigpending函式。
函式原型:
int sigpending(sigset_t *set);
引數說明:
set傳出引數。
返回值:
返回值:成功:0;失敗:-1,設定errno
例:把所有常規訊號的未決狀態列印至螢幕。
#include #include #include void printPending(sigset_t *set) { int i = 0; for (i = 0; i < 32; i++) { if (sigismember(set, i) == 1) printf("1"); else printf("0"); } printf("\n"); } int main() { sigset_t set, oldset, pendset; sigemptyset(&set); sigaddset(&set, SIGQUIT); // ctrl + \ 將產生SIGQUIT訊號 sigprocmask(SIG_BLOCK, &set, &oldset); while (1) { sigpending(&pendset); printPending(&pendset); // 寫一個函式列印未決訊號集 sleep(1); } }
原文來自:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2728384/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MATLAB音訊訊號處理(一):函式簡易用法(audioread,sound函式)Matlab音訊函式
- Qt5的訊號和槽函式QT函式
- QT之靜態函式傳送訊號QT函式
- 遞迴示例-展開編號(Excel函式集團)遞迴Excel函式
- 解析Count函式函式
- QT槽函式獲取訊號傳送物件QT函式物件
- T-SQL——函式——字串操作函式SQL函式字串
- T-SQL——函式——時間操作函式SQL函式
- cache操作函式 --20240310函式
- split() 函式解析 (一)函式
- oracle json 解析函式OracleJSON函式
- 命令列解析函式命令列函式
- Linux Clone函式Linux函式
- main函式解析(一)——Linux-0.11 學習筆記(五)AI函式Linux筆記
- main 函式解析(二)—— Linux-0.11 學習筆記(六)AI函式Linux筆記
- seq_file操作函式函式
- Spark操作開窗函式Spark函式
- Js字串操作函式大全JS字串函式
- php操作string的函式PHP函式
- C++ 序列操作函式C++函式
- 手撕字串操作函式字串函式
- 裝置樹解析函式函式
- pd.Series()函式解析函式
- linux的命令列解析引數之getopt_long函式使用Linux命令列函式
- linux 訊號機制Linux
- linux之__setup函式Linux函式
- 語音訊號處理獲取 NFFT 的自定義函式音訊FFT函式
- 非同步操作系列之Generator函式與Async函式非同步函式
- Semaphore訊號量原始碼解析原始碼
- 1.linux的命令列解析引數之getopt_long函式Linux命令列函式
- 2020.12.04 重寫字串操作函式字串函式
- 常用記憶體操作函式記憶體函式
- bind函式polyfill原始碼解析函式原始碼
- python基礎--函式全解析Python函式
- Python中的main函式解析PythonAI函式
- Qt學習第三篇(訊號槽函式的連線)QT函式
- Linux訊號(signal)機制Linux
- linux 訊號與處理Linux