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 的訊號機制是...