訊號通訊
1、訊號的產生:
訊號是程序間通訊中最為長久的方式,很多條件可以產生訊號,例如:
① 當使用者按某些按鍵時,產生訊號
② 硬體異常產生訊號:除數為0、無效的儲存訪問等等。這些情況通常由硬體檢測到,將其通知核心,然後核心產生適當的訊號通知程序,例如,核心對正訪問乙個無效儲存區的程序產生乙個sigsegv訊號
③ 程序用kill函式將訊號傳送給另乙個程序
④ 使用者可用kill命令將訊號傳送給其他程序
2、常見的幾種訊號
sighup: 從終端上發出的結束訊號
sigint: 來自鍵盤的中斷訊號(ctrl-c)
sigkill:該訊號結束接收訊號的程序,殺死程序
sigterm:kill 命令發出的訊號
sigchld:子程序停止或結束時通知父程序
sigstop:來自鍵盤(ctrl-z)或除錯程式的停止執行訊號,暫停程序
3、訊號的一般處理流程
4、訊號的處理方式:
① 忽略此訊號
大多數訊號都按照這種方式進行處理,但有兩種訊號決不能被忽略,它們是:sigkill\sigstop。
這兩種訊號不能被忽略的原因是:它們向超級使用者提供了一種終止或停止程序的方法
② 執行使用者希望的動作
通知核心在某種訊號發生時,呼叫乙個使用者函式。在使用者函式中,執行使用者希望的處理
③ 執行系統預設動作
對大多數訊號的系統預設動作是終止該程序
5、訊號的傳送方式
(1)用kill函式傳送訊號給指定程序
函式原型:int kill(pid_t pid, int sig);
標頭檔案:#include
#include
引數:pid:
① pid > 0,傳送訊號給程序號指定為pid的程序
② pid = 0,傳送訊號給和當前程序號的程序同組的所有程序
③ pid = -1,廣播訊號給同系統內的所有程序
④ pid < 0,傳送訊號給程序組id為pid絕對值的所有程序
sig:相應的訊號
返回值:執行成功,返回0;執行失敗,返回-1。
(2)用raise函式傳送訊號給自身
函式原型:int raise(int sig);
標頭檔案:#include
引數:sig:相應的訊號
返回值:執行成功,返回0;執行失敗,返回-1。
6、對於上面的常用的兩種訊號的傳送方式,我們用下面的例子來說明一下:
執行效果:#include #include #include #include #include int main()
if(pid == 0) //子程序執行
else //父程序執行
else}}
這裡子程序自己傳送停止程序執行訊號給自身,由於父程序沒有等到子程序退出,故立馬返回0並執行kill(pid,sigkll)語句,將子程序殺死。
7、其他訊號
(1)alarm函式
使用alarm函式可以設定乙個時間值(鬧鐘時間),當所設定的時間到了,產生sigalrm訊號。如果不捕捉此訊號,則預設動作是終止該程序
函式原型:unsigned int alarm(unsigned int seconds);
標頭檔案:#include
引數:設定的時間秒數
返回值:返回之前鬧鐘的剩餘秒數,如果之前未設鬧鐘則返回0.
注意:每個程序只能有乙個鬧鐘時間.如果在呼叫alarm時,以前已為該程序設定過鬧鐘時間,而且它還沒有超時,以前登記的鬧鐘時間則被新值代換。
如果有以前登記的尚未超過的鬧鐘時間,而這次seconds值是0,則表示取消以前的鬧鐘。
上面程式在sleeping列印五次後會列印hello資訊,在5秒時獲得了鬧鐘訊號並執行了相應的訊號函式#include #include #include void handle()
int main()
}
(2)pause函式
作用:使呼叫程序掛起直至捕捉到乙個訊號
函式原型:int pause(void);
標頭檔案:#include
返回值:只返回-1.
8、訊號的處理實現
當系統捕捉到某個訊號時,可以忽略該訊號或是使用指定的處理函式來處理該訊號,或者使用系統預設的方式
(1)signal函式
函式原型:void (*signal(int signum,void(*handler)(int)))(int);
簡化原型:typedef void (*sighandler_t)(int) sighandler_t;
原型變為: sighandler_t signal(int signum, sighandler_t handler);
作用:依照引數signum指定的訊號編號來設定該訊號的處理函式,當指定的訊號到達時就跳轉到引數handler指定的函式執行
標頭檔案:#include
返回值:返回先前訊號處理函式指標。
具體例子如下:(中斷訊號和退出訊號不可忽略)
執行效果:#include #include #include void my_func(int sign_no) //自定義的訊號處理函式
if(sign_no == sigquit) //獲得退出訊號
}int main()
通過按中斷按鍵輸出訊號:ctrl + c
通過按退出按鍵輸出訊號:ctrl + \
Linux 程序間通訊 訊號
訊號是在軟體層次上對中斷機制的一種模擬,在原理上,乙個程序收到乙個訊號與處理器收到乙個中斷請求可以說是一樣的。訊號是非同步的,乙個程序不必通過任何操作來等待訊號的到達,事實上,程序也不知道訊號到底什麼時候到達。訊號是程序間通訊機制中唯一的非同步通訊機制,可以看作是非同步通知,通知接收訊號的程序有哪些...
Linux程序間通訊 訊號
1.什麼是訊號 訊號是linux系統響應某些條件而產生的乙個事件,接收到該訊號的程序會執行相應的操作。2.訊號的產生 1 由硬體產生,如從鍵盤輸入ctrl c可以終止當前程序 2 由其他程序傳送,如可在shell程序下,使用命令 kill 訊號標號 pid,向指定程序傳送訊號。3 異常,程序異常時會...
Linux程序間通訊 訊號
訊號 signals 是unix 類unix以及其他posix相容的作業系統中程序間通訊的一種有限制的方式。它是一種非同步的通知機制,用來提醒程序乙個事件已經發生。當乙個訊號傳送給乙個程序,作業系統中斷了程序正常的控制流程,此時,任何非原子操作都將被中斷。如果程序定義了訊號的處理函式,那麼它將被執行...