程序間通訊(訊號)

2021-07-29 21:37:03 字數 2166 閱讀 4627

linux系統程序間通訊有很多種方式:較多使用的有訊號,管道以及system vipc。各種通訊方式各有優缺點。這部分主要就程序間通訊方式進行總結。

1 訊號。

訊號進行程序間通訊方式有一點需要明確:訊號只能通知,不能在程序間共享資料資源。也就是說訊號僅僅是告訴你一下某個事情發生了。而我們的程式則可以對這個訊號進行各種我們自定義或者預設的處理,更或者當做沒有聽見。

那麼既然是通知一件事情發生了,那肯定是我們關心的一些事情。計算機不像我們人類,告訴我們事情不能任意的表達,所以告訴我們的事情都有固定的格式。那麼我們系統可以告訴我們哪些事情呢?我們可以通過kill -l在系統中檢視。

這是我的系統輸出 ubuntu系統核心為4.4.0。目前該系統定義的有64種訊號。在編寫程式的時候這些訊號被定義為整型(正整型)常量並放在標頭檔案中。

從該圖中可以看出不存在0訊號,該訊號在posix定義為空訊號,系統有特殊的應用

並不是所有主機顯示的訊號都一樣,不同的作業系統對訊號的定義是不一樣的

上面的訊號這裡不一一介紹說明,會在後期的學習和編碼用例中分別舉例說明。

到這裡的時候可能會考慮乙個問題,訊號的種類知道了,那麼系統怎麼通知我呢?

我們使用signal函式(該函式的定義可以使用man查詢)定義我們感興趣的訊號,並對該訊號執行我們的處理方式。一般情況下對訊號的處理有三種方式sig_ign(忽略訊號不做任何處理)、sig_def(執行系統自定義的預設操作)、自定義我們的操作函式。下面使用一段**來看看signal的處理方式。

#include

#include

#include

#include

void sighand(int num)

int main(int argc,char **argv)

}

使用:signal(sigint,sig_dfl);按下ctrl+c之後將會執行系統預設的操作終止程式;呼叫signal(sigint,sig_ign);則會忽略訊號系統沒有任何影響;執行signal(sigint,sighand);則會執行自定義的函式輸出字串和訊號編號。

不過需要注意一點有兩個訊號不能忽略:sigkill和sigstop。

上面的訊號都是系統傳送到我們的應用程式的,但是是否可以程序向程序傳送訊號呢?當然設計者早就想到了這層,使用kill函式,就能達到這樣的目的。下面這段**子程序在5秒後向父程序傳送sigint訊號。(kill不但將訊號發給程序還發給該程序組)

#include

#include

#include

#include

void sighand(int num)

int main()

while(1)

return 0;

}

該段**執行結果如下:

除此之外程序不帶可以向其他程序傳送訊號還能給自己傳送訊號。但是給自己傳送訊號一般使用raise。就不在使用kill了。至於在核心怎樣實現這兩種處理方式,就在後期的核心分析中再繼續說明了。

上面的訊號傳送,都是即發即收。那麼能不能有一種方式我不是馬上傳送訊號而是等待一定的是時間再傳送和處理呢?這個肯定是有的,那就是sigalrm訊號。並使用alarm函式設定乙個定時器,在未來的某個時刻等待定時器超時,一旦超時就發生sigalrm訊號。(該部分就不再過多的使用程式設計實現了)

上面是對單一的訊號進行處理,如果乙個程式需要註冊很多訊號,那麼是否有乙個辦法可以用乙個機制集中管理呢?這就是接下來要說的訊號集。

訊號集使用

sigset_t資料型別表示。針對訊號集系統定義了5個處理函式。

sigemptyset:初始化訊號集,並全部清除

sigfillset:這個和上面的想反,這個函式是設定使其包含系統中全部的訊號

sigaddset:增加乙個訊號

sigdelset:刪除乙個訊號

sigmember:檢視是否包含指定的訊號

(以上幾種函式可以使用man在系統中檢視,這裡就不詳細的貼上)

目前訊號處理就寫到這裡,但是訊號處理還有一些需要擴充,這個在後期的學習中更加深入的學習和擴充套件。()

(後期更新……)

程序間通訊 訊號

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

程序間通訊 訊號

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

程序間通訊 訊號

訊號是程序間通訊機制中唯一的非同步通訊機制,linux系統產生訊號以響應某些條件,當乙個程序接收 捕獲 到乙個訊號會採取相應的行動。其 有兩種 一,硬體,如按下鍵盤或者硬體故障。二,軟體,呼叫傳送訊號的函式 kill,alarm,raise 訊號的種類有以下 1.響應訊號的函式 include 捕獲...