使用 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
12 else if(signum == sigusr2)
13
16 else
17
20 }
21 22 int main(void)
23 43 }
44 else
45
49 }
50
51 return 0;
52 }在這個例程中使用 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;
注意,必須用sigemptyset函式初始化act結構的sa_mask成員。不能保證:act.sa_mask = 0;會做同樣的事情。
對除sigalrm以外的所有訊號,我們都有嘗試設定sa_restart標誌,於是被這些訊號中斷的系統呼叫都能自動重啟動。不希望重啟動由sigalrm訊號中斷的系統呼叫的原因是:我們希望對i/o操作可以設定時間限制。
linux sigaction訊號處理
sigaction函式相比signal函式更為複雜,但更具靈活性,下面具體介紹她的結構和用法 include int sigaction int signum,const struct sigaction act,struct sigaction oldact signum 要操作的訊號。act 要...
linux sigaction函式(註冊訊號)使用
int sigaction int signum,const struct sigaction act,struct sigaction oldact sigaction函式的功能是檢查或修改與指定訊號相關聯的處理動作 可同時兩種操作 引數說明 signum 要操作的訊號 act 要設定的對訊號的新...
WaitForSingleObject函式的使用
程式舉例 1 建立對話方塊應用程式,專案名稱為mytestthread 2 新增按鈕,命名為啟動和停止,在對話方塊中增加編輯框,id為idc time,3 增加成員變數,handle m hthread 2 此為執行緒的控制代碼 4 定義全域性變數,用來控制線程的執行與否 volatile bool...