linux c sigaction 訊號函式

2021-10-01 17:19:00 字數 1941 閱讀 5213

使用 sigaction 函式:

signal 函式的使用方法簡單,但並不屬於 posix 標準,在各類 unix 平台上的實現不盡相同,因此其用途受

到了一定的限制。而 posix 標準定義的訊號處理介面是 sigaction 函式,其介面標頭檔案及原型如下:

#include int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
◆ signum:要操作的訊號。

◆ act:要設定的對訊號的新處理方式。

◆ oldact:原來對訊號的處理方式。

◆ 返回值:0 表示成功,-1 表示有錯誤發生。

struct sigaction 型別用來描述對訊號的處理,定義如下:

struct sigaction

;

在這個結構體中,成員 sa_handler 是乙個函式指標,其含義與 signal 函式中的訊號處理函式類似。成員

sa_sigaction 則是另乙個訊號處理函式,它有三個引數,可以獲得關於訊號的更詳細的資訊。當 sa_flags 成員的值

包含了 sa_siginfo 標誌時,系統將使用 sa_sigaction 函式作為訊號處理函式,否則使用 sa_handler 作為訊號處理

函式。在某些系統中,成員 sa_handler 與 sa_sigaction 被放在聯合體中,因此使用時不要同時設定。

sa_mask 成員用來指定在訊號處理函式執行期間需要被遮蔽的訊號,特別是當某個訊號被處理時,它自身會被

自動放入程序的訊號掩碼,因此在訊號處理函式執行期間這個訊號不會再度發生。

sa_flags 成員用於指定訊號處理的行為,它可以是一下值的「按位或」組合。

◆ sa_restart:使被訊號打斷的系統呼叫自動重新發起。

◆ sa_nocldstop:使父程序在它的子程序暫停或繼續執行時不會收到 sigchld 訊號。

◆ sa_nocldwait:使父程序在它的子程序退出時不會收到 sigchld 訊號,這時子程序如果退出也不會成為僵

屍程序。

◆ sa_nodefer:使對訊號的遮蔽無效,即在訊號處理函式執行期間仍能發出這個訊號。

◆ sa_resethand:訊號處理之後重新設定為預設的處理方式。

◆ sa_siginfo:使用 sa_sigaction 成員而不是 sa_handler 作為訊號處理函式。

re_restorer 成員則是乙個已經廢棄的資料域,不要使用。

下面用乙個例程來說明 sigaction 函式的使用,**如下:

#include #include #include #include static void sig_usr(int signum)

else if(signum == sigusr2)

else

}int main(void)

}else

}return 0;

}

在這個例程中使用 sigaction 函式為 sigusr1 和 sigusr2 訊號註冊了處理函式,然後從標準輸入讀入字元

。程式執行後首先輸出自己的 pid,如:

my pid is 5904

這時如果從另外乙個終端向程序傳送 sigusr1 或 sigusr2 訊號,用類似如下的命令:

kill -usr1 5904

則程式將繼續輸出如下內容:

sigusr1 received

read is interrupted by signal

這說明用 sigaction 註冊訊號處理函式時,不會自動重新發起被訊號打斷的系統呼叫。如果需要自動重新發

起,則要設定 sa_restart 標誌,比如在上述例程中可以進行類似一下的設定:

sa_usr.sa_flags = sa_restart;

pthread kill向子程序傳送訊號函式

pthread kill 別被名字嚇到,pthread kill可不是kill,而是向執行緒傳送signal。還記得signal嗎,大部分signal的預設動作是終止程序的執行,所以,我們才要用signal 去抓訊號並加上處理函式。int pthread kill pthread t thread,...

WaitForSingleObject函式的使用

程式舉例 1 建立對話方塊應用程式,專案名稱為mytestthread 2 新增按鈕,命名為啟動和停止,在對話方塊中增加編輯框,id為idc time,3 增加成員變數,handle m hthread 2 此為執行緒的控制代碼 4 定義全域性變數,用來控制線程的執行與否 volatile bool...

cvCreateVideoWriter函式使用

cvcreatevideowriter函式使用 2011 11 04 15 47 例如,cv fourcc p i m 1 是mpeg 1 codec,cv fourcc m j p g 是motion jpeg codec cv fourcc m p 4 2 mpeg 4.2 codec cv f...