信號概念 信號(signal)是linux進程間通信的一種機制,全稱為軟中斷信號,也被稱為軟中斷。信號本質上是在軟件層次上 對硬件中斷機制的一種模擬。
信號由內核管理
產生的方式: 可以由內核自身產生,比如出現 硬件錯誤、內存讀取錯誤,分母為0的除法等,內核需要通知相應進程。 也可以由其他進程產生并發送給內核,再由內核傳遞給目標進程。
什么信號不能捕捉也不能忽略? SIGKILL(終止進程) SIGSTOP (暫停進程)
kill -l // 查看系統支持的所有的信號
發送信號
$ kill -signal pid $ kill -9 1001 // 強制殺死1001進程
信號處理機制 可以用函數signal注冊一個信號捕捉函數
#include<signal.h>typedefvoid(*sighandler_t)(int);//函數指針sighandler_tsignal(intsignum,sighandler_thandler);signal 調用成功,返回處理函數的地址,否則返回SIG_ERR
#include<signal.h>#include<stdio.h>#include<unistd.h>void ouch(int sig){ 進程的四種狀態 RSTZ T:暫停sigaction信號處理機制
3.1 信號情況處理分析 注冊信號處理函數 當注冊信號函數正在處理時,來了同類信號排隊執行 當注冊信號函數正在處理時,捕捉到其他類信號,打斷然后先執行其他類信號, 如果在發生信號時,程序正阻塞在某個系統調用,例如調用 read()函數,則在處理完畢信號后,接著從阻塞的系統返回。如 果不指定該參數,中斷處理完畢之后,read函數讀取失敗。
#include<signal.h> int sigaction(int sig,const struct sigaction *act,struct sigaction *oact);
這個函數和signal 函數一樣,用于設置與sig關聯的動作。而oact不為空的話,它會保存原來的signal的位置。act則用于設置指定信號的動作。
3.2.sigaction信號處理注冊 函數原型: #include<signal.h> int sigaction(int signum,const struct siginfo_t *act ,struct sigaction *oldact)
sa_handler 和 sa_sigaction 只能一個生效
新聞熱點
疑難解答