概念:
軟中斷訊號,用來通知程序發生了非同步事件。
系統預先定義好的某些特定事件,訊號可以被傳送,也可以被接受,傳送和接受的主題都是程序。
有以下條件可以產生訊號:
在linux系統下定義了一些訊號:
儲存位置為:
乙個程序接收到訊號後的處理
如何修改訊號的響應方式?
linux提供了一種系統呼叫:
函式位址 signal(int sig,函式位址);
第乙個引數sig,要傳入希望修改的訊號編號/值。
第二個引數,是乙個無返回值、接收乙個int形參的函式指標。指向乙個使用者處理函式。第二個引數有三種選擇:
我們自己定義的訊號處理函式傳入sig_dfl表示將之前改變的訊號處理方式還原第三種是傳入sig_ign,表示忽略該訊號
訊號處理函式的宣告
void
signal_fun
(int
);
原型:
#include
void(*
signal
(int sig,
void
(*hander)
(int))
)(int)
;
在程式啟動時修改,修改之後程序收到此訊號,系統自動呼叫設定的函式。
例子:繫結ctrl + c與signal_fun函式
#include
#include
#include
//訊號處理函式
void
signal_fun
(int sign)
intmain()
exit(0);}
增加自定義訊號處理函式的睡眠時間後,如果主函式程序接收到乙個訊號,會停止當前的執行邏輯,等待訊號處理函式執行完畢後,再接著主函式的邏輯執行如下**所示:
#include
#include
#include
//訊號處理函式
void
signal_fun
(int sign)
intmain()
exit(0);}
訊號處理函式的執行過程中,程序最多接受一次訊號,在本例中訊號處理函式執行過程中連續按下多個ctrl+c卻只會執行一次訊號處理函式,這裡可以認為是一種訊號遮蔽
問題,因此訊號處理函式要盡可能快地執行結束,防止訊號被長時間遮蔽,——>統一事件源,將訊號處理函式放在主邏輯中執行處理,因為主邏輯是不會被遮蔽的。
}}例:執行程式,第一次接收到sigint訊號,程序列印helloworld,第二次接受sigint訊號,程序結束
方法:
第一次接受訊號:fun
第二次接受訊號前,將訊號的響應方式修改為預設sig_dfl
第二次接收訊號,預設退出程式
#include
#include
#include
void
fun(
int sign)
intmain()
}
linux提供了一種系統呼叫:
int
kill
(pid_t pid,
int signtype)
;//signtype是要傳送的訊號
kill方法的pid引數有四種不同的情況pid>0,將該訊號傳送給程序id為pid的程序
pid ==0,將該訊號傳送給與傳送程序屬於同一程序組的所有程序,而且傳送程序具有向這些程序傳送訊號的許可權
pid<0,將該訊號傳送給其程序組id等於pid的絕對值的程序,而且傳送程序具有向這些程序傳送訊號的許可權
pid ==-1,將該訊號傳送給傳送程序有許可權向它們傳送訊號的系統上的所有程序
例:利用kill方法,實現kill命令
#include
#include
#include
intmain
(int argc,
char
*ar**)
//ar**[0]:kill ar**[1]: -9 / pid
int i=1;
int sign = sigterm;
//kill命令的預設訊號if(
strncmp
(ar**[1]
,"-9",2
)==0)
for(
;isprintf
(buff,
"%d"
,pid)
;//把%d形式存入buff
perror
(buff)
;//標準錯誤輸出}}
exit(0);}
有了程序替換,fork之後,子程序就可以呼叫乙個全新的程式,這個程式可以由使用者指定(動態制定),以實現模組化程式設計
,使用者輸入什麼,呼叫什麼。
我們的終端程式的實現就是這樣的:
請看下面的分析
今天就這麼多!
Linux 程序替換
當程序呼叫exec函式執行磁碟裡另乙個程式時,並不建立新程序,呼叫前後程序id並未改變,新程序的資料和 會替換掉物理記憶體中的資料段和 段,從而虛擬根據頁表找到的資料和 都會別替換成新的,所以當程序開始執行時,就要從要執行的程式開始執行。系統呼叫 int execve const char path...
linux 10訊號底層實現機制程序替換
1.非同步執行 兩個以上的程序或執行緒,執行互不影響,同時向下執行,當某個時刻,乙個程序或執行緒會通過系統機制通知其他程序或執行緒。非阻塞狀態 2.同步執行 乙個程序或執行緒的執行需要依賴其他的程序或執行緒執行的條件 阻塞狀態 3.阻塞 條件未準備好,程序在這停下,一直等著 4.非阻塞 條件準備好,...
Linux 程序訊號
概念 訊號是程序之間事件非同步通知的一種方式,屬於軟中斷。訊號處理常見方式 忽略此訊號。執行該訊號的預設處理動作。提供乙個訊號處理函式,要求核心在處理該訊號時切換到使用者態執行這個處理函式,這種方式稱為捕捉 catch 乙個訊號。產生訊號 捕捉訊號 核心如何實現訊號的捕捉 如果訊號的處理動作是使用者...