sigaction函式解析
sigaction函式的功能是檢查或修改與指定訊號相關聯的處理動作(可同時兩種操作)。
他是POSIX的訊號介面,而signal()是標準C的訊號介面(如果程式必須在非POSIX系統上執行,那麼就應該使用這個介面)
給訊號signum設定新的訊號處理函式act, 同時保留該訊號原有的訊號處理函式oldact
int sigaction(int signo,const struct sigaction *restrict act, struct sigaction *restrict oact); |
結構sigaction定義如下:
struct
sigaction{ |
sa_handler欄位包含一個訊號捕捉函式的地址
sa_mask欄位說明了一個訊號集,在呼叫該訊號捕捉函式之前,這一訊號集要加進程式的訊號遮蔽字中。僅當從訊號捕捉函式返回時再將程式的訊號遮蔽字復位為原先值。
sa_flag是一個選項,主要理解兩個
SA_INTERRUPT 由此訊號中斷的系統呼叫不會自動重啟 SA_SIGINFO 提供附加資訊,一個指向siginfo結構的指標以及一個指向程式上下文識別符號的指標 |
最後一個引數是一個替代的訊號處理程式,當設定SA_SIGINFO時才會用他。
例子:
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
void show_handler(int sig)
{
printf("I got signal %d\n", sig);
int i;
for(i = 0; i < 5; i++) {
printf("i = %d\n", i);
sleep(1);
}
}
int main(void)
{
int i = 0;
struct sigaction act, oldact;
act.sa_handler = show_handler;
sigaddset(&act.sa_mask, SIGQUIT); //見注(1)
act.sa_flags = SA_RESETHAND | SA_NODEFER; //見注(2)
//act.sa_flags = 0; //見注(3)
sigaction(SIGINT, &act, &oldact);
while(1) {
sleep(1);
printf("sleeping %d\n", i);
i++;
}
}
注:
(1) 如果在訊號SIGINT(Ctrl + c)的訊號處理函式show_handler執行過程中,本程式收到訊號SIGQUIT(Crt+\),將阻塞該訊號,直到show_handler執行結束才會處理訊號SIGQUIT。
(2) SA_NODEFER 一般情況下, 當訊號處理函式執行時,核心將阻塞<該給定訊號 -- SIGINT>。但是如果設定了SA_NODEFER標記, 那麼在該訊號處理函式執行時,核心將不會阻塞該訊號。 SA_NODEFER是這個標記的正式的POSIX名字(還有一個名字SA_NOMASK,為了軟體的可移植性,一般不用這個名字)
SA_RESETHAND 當呼叫訊號處理函式時,將訊號的處理函式重置為預設值。 SA_RESETHAND是這個標記的正式的POSIX名字(還有一個名字SA_ONESHOT,為了軟體的可移植性,一般不用這個名字)
(3) 如果不需要重置該給定訊號的處理函式為預設值;並且不需要阻塞該給定訊號(無須設定sa_flags標誌),那麼必須將sa_flags清零,否則執行將會產生段錯誤。但是sa_flags清零後可能會造成訊號丟失!
相關文章
- 第二十五篇:使用 sigaction 函式實現可靠訊號函式
- async函式解析函式
- 【C/C++】訊號處理之sigaction函式的健壯性測試C++函式
- split() 函式解析 (一)函式
- 命令列解析函式命令列函式
- pd.Series()函式解析函式
- oracle json 解析函式OracleJSON函式
- Generator函式語法解析函式
- 裝置樹解析函式函式
- bind函式polyfill原始碼解析函式原始碼
- DEDECMS裡面DEDE函式解析函式
- 【轉】分析函式語法解析函式
- JavaScript 之有趣的函式(函式宣告、呼叫、預解析、作用域)JavaScript函式
- 【複變函式與積分變換】02. 解析函式函式
- python基礎--函式全解析Python函式
- snabbdom原始碼解析(二) h函式原始碼函式
- Python中的main函式解析PythonAI函式
- C++如何解析函式呼叫C++函式
- [譯] 解析 Go 中的函式呼叫Go函式
- C++ 虛擬函式表解析C++函式
- oracle dump函式解析_字符集Oracle函式
- 【C++筆記】虛擬函式(從虛擬函式表來解析)C++筆記函式
- 【C++筆記】虛擬函式(從虛擬函式概念來解析)C++筆記函式
- Python 偏函式用法全方位解析Python函式
- 解析如何在Bash中編寫函式函式
- PHP八大安全函式解析PHP函式
- 前端常用的小函式(1)—解析url前端函式
- 解析Linux訊號集操作函式Linux函式
- PHPCMS V9 分頁函式解析PHP函式
- 更智慧的JavaScript回撥函式解析JavaScript函式
- 深入解析 ES6:箭頭函式函式
- C++虛擬函式解析(轉載)C++函式
- Linux訊號捕捉之sigactionLinux
- 解析python生成器函式的呼叫Python函式
- PHP 字串中直接解析函式的寫法PHP字串函式
- Linux 中的 fork() 函式例項解析Linux函式
- MySQL函式大全(字串函式,數學函式,日期函式,系統級函式,聚合函式)MySql函式字串
- Python range與enumerate函式區別解析Python函式