signal函式 程序對訊號的響應

2021-07-25 07:34:11 字數 1778 閱讀 6038

1.signal函式

#include

void (*signal(int signo, void (*func)(int)))(int);

返回:若成功則返回先前的訊號處理函式指標,出錯則返回sig_err;

功能:向核心登記訊號處理函式;

引數:signo:要登記的訊號值

func:a.訊號處理函式指標;b.sig_ign,忽略訊號;c.sig_dfl,採用系統預設的方式處理訊號,執行預設操作

2.程序對訊號的三種響應

下面以sigint訊號為例,對這三種響應方式進行說明。

(1)忽略訊號,signal(sigint,sig_ign);

sig_ign代表忽略sigint訊號,sigint訊號代表由interruptkey產生,通常是ctrl+c或者是delete。傳送給所有foreground group的程序。

下面我們寫個死迴圈:

#include #include int main(void)

這時我們儲存執行,按下ctrl+c程式沒有反應,這就對了。

如果我們想結束該程式可以按下ctrl+\來結束

其實當我們按下ctrl+\組合鍵時,是產生了sigquit訊號。

(2)執行預設操作,signal(sigint, sig_dfl)

sig_dfl代表執行系統預設操作,其實對於大多數訊號的系統預設動作是終止改程序,與不寫此處理函式的效果是一樣的。

#include #include int main(void)

這時就可以按下ctrl+c來終止該程序了。把signal(sigint, sig_dfl)這句去掉,效果是一樣的。

(3)捕獲訊號,signal(sigint, sig_handler);

#include #include void sig_handler(int signo)

int main(void)

這種情況下,當按下ctrl+c時,會執行我們定義的訊號處理函式。

想要退出,可以按下ctrl+\

3.對訊號處理的幾點說明

(1) sigkill和sigstop這兩個訊號永遠不能忽略;

(2) sigkill和sigstop不能**獲(即使已經登記了,也不能**獲);

(3) 程序啟動時sigusr1和sigusr2兩個訊號被忽略;

4.幾個常見的訊號

(1)sigint,編號為2,相當於執行ctrl+c;

(2)sigtstp,編號為20,相當於ctrl+z,暫停乙個程序;

(3)sigcont,編號為18,繼續執行被暫停的訊號,格式為:kill -sigcont/18 程序id

(4)sigchld,編號為17,子程序結束產生該訊號;(訊號的非同步處理表現在:當sigchld產生時,父程序對其捕獲處理,其他時間父程序該幹嘛幹嘛)

下面舉例來說明sigchld訊號的用法。

#include #include #include #include #include #include void sig_handler(int signo)

void out(int n)

}int main(void)

pid_t pid = fork();

if(pid < 0)

else if(pid > 0)

else

return 0;

}

對訊號註冊函式signal的理解1

signal函式的原型是 void signal int signum,void handler int int 引數說明 signum 指定的訊號 其中函式指標handler的取值 其中的引數sig ign和sig dfl是這樣定義的 而 sighandler t又是按下面的方式定義的 其中,si...

對訊號註冊函式signal的理解1

signal函式的原型是 void signal int signum,void handler int int 引數說明 signum 指定的訊號 其中函式指標handler的取值 其中的引數sig ign和sig dfl是這樣定義的 而 sighandler t又是按下面的方式定義的 其中,si...

程序間通訊 訊號(signal)

訊號 signal 機制是linux系統中最為古老的程序之間到通訊機制。linux訊號也可以稱為軟中斷,是在軟體層上對中斷機制到一種模擬。訊號是非同步的,它是程序間通訊機制中唯一的非同步通訊機制。linux 系統中定義一系列到訊號,可以使用 kill l 命令列出所有到訊號。linux 的訊號機制是...