程序間通訊 訊號

2021-10-01 04:16:29 字數 2163 閱讀 1340

程序間通訊有很多種方式,常見的有管道,訊息佇列,訊號量,共享記憶體,還有訊號,這篇文章主要結合實列簡單介紹訊號函式的使用,以及有哪些常用的訊號型別

常用的訊號型別有以下幾種:

sigterm:可以捕捉,預設執行操作是終止程式,終端執行kill 或者 kill -15傳送該訊號

sigkill:不可以捕捉,預設執行操作是終止程式,終端執行kill -9 傳送該訊號

sigalrm:定時器超時訊號

sigusr1,sigusr2:使用者定義訊號

sigchld:子程序退出時傳送給發程序的訊號

當某個訊號出現時,可以告訴核心按下面的3種方式之一進行處理

1. 忽略該訊號,大多數訊號都可以使用這種方式進行處理,但是sigkill和sigstop這兩種訊號不可以忽略

2. 捕捉訊號,這個是通知核心在某種訊號產生時,呼叫乙個使用者函式,在使用者函式中,可執行使用者希望對這種事件進行處理

3. 執行系統預設動作,系統對每種訊號都有乙個預設動作,需要注意的是對大多數訊號,系統的預設動作是終止該程序

下面介紹下乙個unix系統訊號機制最簡單的介面signal 函式

原型如下

#include

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);

下面簡單演示下該介面的使用,讓signal捕捉兩個使用者定義的訊號並列印訊號編號

#include #include #include #include static void sig_usr(int signo)

else if (sigusr2 == signo)

else }

int main(void)

if (signal(sigusr2, sig_usr) == sig_err)

for(; ;)

return 0;

}

結果如下:

mcchen-virtual-machine:/home/mywork/test/signal$ ./signal  & //在後台啟動程序

[1] 5472 //作業控制shell列印作業編號和程序id

mcchen-virtual-machine:/home/mywork/test/signal$ kill -usr1 5472 //向該程序傳送sigusr1

received sigusr1

mcchen-virtual-machine:/home/mywork/test/signal$ kill -usr2 5472 //向該程序傳送sigusr2

received sigusr2

mcchen-virtual-machine:/home/mywork/test/signal$ kill 5472 //向該程序傳送sigterm

[1]+ terminated ./signal

/*由於程式並沒有捕捉sigterm訊號,而對該訊號的系統預設動作是終止,所以當向該程序傳送sigterm訊號後,該程序就終止*/

sigkill和sigstop兩個訊號捕捉不了,下面通過例項演示下

#include #include #include #include static void sig_usr(int signo)

else if (sigusr2 == signo)

else }

int main(void)

if (signal(sigstop, sig_usr) == sig_err)

for(; ;)

return 0;

}

結果如下

mcchen@mcchen-virtual-machine:/home/mywork/test/signal$ 

can't catch sigkill //捕捉不了sigkill

can't catch sigstop //捕捉不了sigstop

總結下,這篇文章簡單介紹了signal的使用,以及訊號的種類,以及sigkill和sigstop兩個訊號不可以忽略或捕捉,其它訊號可以忽略捕捉,預設是終止程序,後面有時間會詳細介紹signal衍生的其它介面,謝謝。

程序間通訊 訊號

關於訊號在程序間的通訊,這是乙個比較複雜的東西,本人不在這裡做過多的介紹.如果想系統的學習,請參考 unix環境高階程式設計這本書 我在這裡只展示幾個例子 用守護程序實現檔案的同步.由子程序1改乙個檔案,守護程序2,檢查到檔案已經改變,並通過訊號告訴給父程序,父程序實現輸出.程式有點複雜,但思路還是...

程序間通訊(訊號)

linux系統程序間通訊有很多種方式 較多使用的有訊號,管道以及system vipc。各種通訊方式各有優缺點。這部分主要就程序間通訊方式進行總結。1 訊號。訊號進行程序間通訊方式有一點需要明確 訊號只能通知,不能在程序間共享資料資源。也就是說訊號僅僅是告訴你一下某個事情發生了。而我們的程式則可以對...

程序間通訊 訊號

訊號 概念 訊號是在軟體層次上對中斷機制的一種模擬,它是比較複雜的通訊方式,用於通知程序有某事件發生,乙個程序收到乙個訊號與處理器收到乙個中斷請求效果上可以說是一致的。程序在接收到這個訊號以後,可以設定響應的處理動作 忽略或者呼叫函式進行處理。在linux下命令列 kill l 可以檢視linux下...