程序間通訊方式總結

2021-12-29 19:48:08 字數 1476 閱讀 4143

而對unix發展做出重大貢獻的兩大主力at&t的貝爾實驗室及bsd(加州大學伯克利分校的伯克利軟體發布中心)在程序間通訊方面的側重點有所不同。前者對unix早期的程序間通訊手段進行了系統的改進和擴充,形成了「system v ipc」,通訊程序侷限在單個計算機內;後者則跳過了該限制,形成了基於套介面(socket)的程序間通訊機制。linux則把兩者繼承了下來,如圖示:

1.管道(pipe)及有名管道(named pipe):管道可用於具有親緣關係程序間的通訊,有名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關係程序間的通訊;

2.訊號(signal):訊號是比較複雜的通訊方式,用於通知接受程序有某種事件發生,除了用於程序間通訊外,程序還可以傳送訊號給程序本身;linux除了支援unix早期訊號語義函式sigal外,還支援語義符合posix.1標準的訊號函式sigaction(實際上,該函式是基於bsd的,bsd為了實現可靠訊號機制,又能夠統一對外介面,用sigaction函式重新實現了signal函式);

3.報文(message)佇列(訊息佇列):訊息佇列是訊息的鏈結表,包括posix訊息佇列system v訊息佇列。有足夠許可權的程序可以向佇列中新增訊息,被賦予讀許可權的程序則可以讀走佇列中的訊息。訊息佇列克服了訊號承載資訊量少,管道只能承載無格式位元組流以及緩衝區大小受限等缺點。

4.共享記憶體:使得多個程序可以訪問同一塊記憶體空間,是最快的可用ipc形式。是針對其他通訊機制執行效率較低而設計的。往往與其它通訊機制,如訊號量結合使用,來達到程序間的同步及互斥。

訊號量(semaphore):主要作為程序間以及同一程序不同執行緒之間的同步手段。

5.套介面(socket):更為一般的程序間通訊機制,可用於不同機器之間的程序間通訊。起初是由unix系統的bsd分支開發出來的,但現在一般可以移植到其它類unix系統上:linux和system v的變種都支援套接字。

乙個原始的ipc方式是所有的程序通過乙個檔案交流。比如我在紙(檔案)上寫下我的名字和年紀。另乙個人讀這張紙,會知道我的名字和年紀。他也可以在同一張紙上寫下他的資訊,而當我讀這張紙的話,同樣也可以知道別人的資訊。但是,由於硬碟讀寫比較慢,所以這個方式效率很低。那麼,我們是否可以將這張紙放入記憶體中以提高讀寫速度呢?

同樣,許多程式語言中,也有一些命令用以實現類似的機制,比如在python子程序中使用popen和pipe,在c語言中也有popen庫函式來實現管道 (shell中的管道就是根據此編寫的)。管道是由核心管理的乙個緩衝區(buffer),相當於我們放入記憶體中的乙個紙條。管道的一端連線乙個程序的輸出。這個程序會向管道中放入資訊。管道的另一端連線乙個程序的輸入,這個程序取出被放入管道的資訊。乙個緩衝區不需要很大,它被設計成為環形的資料結構,以便管道可以被迴圈利用。當管道中沒有資訊的話,從管道中讀取的程序會等待,直到另一端的程序放入資訊。當管道被放滿資訊的時候,嘗試放入資訊的程序會等待,直到另一端的程序取出資訊。當兩個程序都終結的時候,管道也自動消失。

程序間通訊方式總結

一 linux系統程序間通訊的方式 二 windows程序間通訊的各種方法 程序是裝入記憶體並準備執行的程式,每個程序都有私有的虛擬位址空間,由 資料以及它可利用的系統資源 如檔案 管道等 組成。多程序 多執行緒是windows作業系統的乙個基本特徵。microsoft win32 api 提供了大...

程序間通訊方式總結

至 linux下的程序間通訊手段,程序間通訊 inter process communication 簡稱ipc 1.管道 pipe 以及有名管道 named pipe 管道可用於具有親緣關係程序間的通訊,有名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關係程序間的通...

程序間 執行緒間通訊方式總結

管道 pipe 管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。有名管道 namedpipe 有名管道也是半雙工的通訊方式,但是它允許無親緣關係程序間的通訊。訊號量 semophore 訊號量是乙個計數器,可以用來控制多個程序對共...