訊號的捕獲和處理

2021-08-13 15:57:05 字數 1507 閱讀 9224

訊號(signal)是在特定事件發生時由作業系統向程序傳送的訊息。它一種軟體中斷,是程序間唯一的非同步通訊方式。

訊號有很多,常見的有:

訊號的捕捉和處理

訊號的捕捉和處理由以下2個函式來完成,其中第乙個函式也是由第二個函式實現的:

#include sighandler_t signal(int signum, sighandler_t handler);

int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);

引數signum指定訊號的種類,比如sigint、sigkill等。

引數handler是乙個函式指標,指定捕捉到該訊號後的處理函式。

signal函式執行成功時返回訊號處理函式指標,發生錯誤時返回sig_err。

sigaction函式類似於signal函式,而且它完全可以替代後者,也更穩定。之所以穩定,是signal函式在unix系列的不同作業系統中可能存在區別,但sigaction函式完全相同。實際上現在很少用signal函式來編寫程式,它只是為了保持對舊程式的相容。

1. signal()函式

#include #include /*訊號處理函式*/

void handler_sigint(int signo)

int main()

程式使用signal()安裝sigint的處理函式handler_sigint,然後進入無限迴圈。當接收到sigint訊號時,程式自動跳轉到訊號處理函式處執行,列印出提示資訊。然後返回主函式繼續無限迴圈。執行結果如下:

2. sigaction()函式

sigaction函式中用到了乙個結構體sigaction作為引數。此結構體中的字段常用的有2個,sa_handler用來指定訊號發生後的處理函式,sa_flags用來進行一些設定。

#include #include #include int temp = 0;

/*訊號處理函式*/

void handler_sigint(int signo)

int main()

執行上述程式後,在鍵盤上快速按下5次組合鍵,螢幕上會連續列印出5行提示訊息。在休眠5秒後,再將臨時變數temp的值依次列印出來。這是由於設定了sa_flags的值為sa_nomask,因此程式能夠反覆響應訊號sigint,程式從sleep()處巢狀呼叫訊號處理函式handler_sigint,多次列印出「recv sigint」。睡眠5秒後,將temp的值列印出來並返回到本次訊號處理程式的跳入點sleep()處,最後返回到主函式。

Linux訊號的捕獲

typedef void sighandler t int 功能 自定義的函式,以函式指標的方式用於下面的signal訊號註冊函式中的handler函式 sighandler t signal int signum,sighandler t handler 功能 訊號處理註冊函式 signum 訊號...

bash程式設計的訊號捕獲

bash程式設計的訊號捕獲 一.trap捕捉到訊號之後,可以有三種反應方式 1 執行一段程式來處理這一訊號 2 接受訊號的預設操作 3 忽視這一訊號 二第一種形式的trap命令在shell接收到signal list清單中數值相同的訊號時,將執行雙引號中的命令串。trap commands sign...

linux訊號捕獲相關

linux中一共有32種訊號,在 usr include bits signum.h 標頭檔案中可以看到 define sighup 1 define sigint 2 define sigquit 3 define sigill 4 define sigtrap 5 define sigabrt ...