程序之間通訊的方式主要有:
管道(pipe),流管道(s_pipe)和有名管道(fifo)
訊號(signal)
訊息佇列
共享記憶體
訊號量套接字(socket)
管道這種通訊方式有兩種限制,一是半雙工的通訊,資料只能單向流動,二是只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。
流管道s_pipe: 去除了第一種限制,可以雙向傳輸.
管道可用於具有親緣關係程序間的通訊,命名管道:name_pipe克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關係程序間的通訊;
訊號量是乙個計數器,可以用來控制多個程序對共享資源的訪問。它常作為一種鎖機制,防止某程序正在訪問共享資源時,其他程序也訪問該資源。因此,主要作為程序間以及同一程序內不同執行緒之間的同步手段。
訊號是比較複雜的通訊方式,用於通知接受程序有某種事件發生,除了用於程序間通訊外,程序還可以傳送訊號給程序本身;linux除了支援unix早期訊號語義函式sigal外,還支援語義符合posix.1標準的訊號函式sigaction(實際上,該函式是基於bsd的,bsd為了實現可靠訊號機制,又能夠統一對外介面,用sigaction函式重新實現了signal函式);
訊息佇列是由訊息的鍊錶,存放在核心中並由訊息佇列識別符號標識。訊息佇列克服了訊號傳遞資訊少、管道只能承載無格式位元組流以及緩衝區大小受限等缺點。
訊息佇列是訊息的鏈結表,包括posix訊息佇列system v訊息佇列。有足夠許可權的程序可以向佇列中新增訊息,被賦予讀許可權的程序則可以讀走佇列中的訊息。訊息佇列克服了訊號承載資訊量少,管道只能承載無格式位元組流以及緩衝區大小受限等缺點。
訊號是一種比較複雜的通訊方式,用於通知接收程序某個事件已經發生。
主要作為程序間以及同一程序不同執行緒之間的同步手段。
共享記憶體就是對映一段能被其他程序所訪問的記憶體,這段共享記憶體由乙個程序建立,但多個程序都可以訪問。共享記憶體是最快的 ipc 方式,它是針對其他程序間通訊方式執行效率低而專門設計的。它往往與其他通訊機制,如訊號量,配合使用,來實現程序間的同步和通訊。
使得多個程序可以訪問同一塊記憶體空間,是最快的可用ipc形式。是針對其他通訊機制執行效率較低而設計的。往往與其它通訊機制,如訊號量結合使用,來達到程序間的同步及互斥。
套解口也是一種程序間通訊機制,與其他通訊機制不同的是,它可用於不同機器間的程序通訊
更為一般的程序間通訊機制,可用於不同機器之間的程序間通訊。起初是由unix系統的bsd分支開發出來的,但現在一般可以移植到其它類unix系統上:linux和system v的變種都支援套接字。
注:無連線: 指無需呼叫某種形式的open,就有傳送訊息的能力流控制:
如果系統資源短缺或者不能接收更多訊息,則傳送程序能進行流量控制
各種通訊方式的比較和優缺點
如果使用者傳遞的資訊較少或是需要通過訊號來觸發某些行為.前文提到的軟中斷訊號機制不失為一種簡捷有效的程序間通訊方式.
但若是程序間要求傳遞的資訊量比較大或者程序間存在交換資料的要求,那就需要考慮別的通訊方式了。
無名管道簡單方便.但侷限於單向通訊的工作方式.並且只能在建立它的程序及其子孫程序之間實現管道的共享:
有名管道雖然可以提供給任意關係的程序使用.但是由於其長期存在於系統之中,使用不當容易出錯.所以普通使用者一般不建議使用。
訊息緩衝可以不再侷限於父子程序,而允許任意程序通過共享訊息佇列來實現程序間通訊,並由系統呼叫函式來實現訊息傳送和接收之間的同步,從而使得使用者在使用訊息緩衝進行通訊時不再需要考慮同步問題,使用方便,但是資訊的複製需要額外消耗cpu的時間,不適宜於資訊量大或操作頻繁的場合。
共享記憶體針對訊息緩衝的缺點改而利用記憶體緩衝區直接交換資訊,無須複製,快捷、資訊量大是其優點。
但是共享記憶體的通訊方式是通過將共享的記憶體緩衝區直接附加到程序的虛擬位址空間中來實現的,因此,這些程序之間的讀寫操作的同步問題作業系統無法實現。必須由各程序利用其他同步工具解決。另外,由於記憶體實體存在於計算機系統中,所以只能由處於同乙個計算機系統中的諸程序共享。不方便網路通訊。
共享記憶體塊提供了在任意數量的程序之間進行高效雙向通訊的機制。每個使用者都可以讀取寫入資料,但是所有程式之間必須達成並遵守一定的協議,以防止諸如在讀取資訊之前覆寫記憶體空間等競爭狀態的出現。
不幸的是,linux無法嚴格保證提供對共享記憶體塊的獨佔訪問,甚至是在您通過使用ipc_private建立新的共享記憶體塊的時候也不能保證訪問的獨占性。 同時,多個使用共享記憶體塊的程序之間必須協調使用同乙個鍵值。
程序間通訊方式
謝謝作者 用於程序間通訊 ipc 的四種不同技術 共享記憶體,臨界區,管道,訊息 1.訊息傳遞 管道,fifo,posix和system v訊息佇列 2.同步 互斥鎖,條件變數,讀寫鎖,檔案和記錄鎖,posix和system v訊號燈 3.共享記憶體區 匿名共享記憶體區,有名posix共享記憶體區,...
程序間通訊方式
遇到一考題,讓寫出程序間的通訊方式,突然給忘了,只想起管道和共享記憶體以及套接字。現在總結一下程序間的通訊方式以及他們之間的區別 1 管道 pipe 管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。2 有名管道 named pip...
程序間通訊方式
程序間通訊主要包括管道,系統ipc 包括訊息佇列,訊號量 共享儲存 socket套接字。windows系統程序間通訊 windows提供了多種機制,使得應用程式之間能夠快速 方便地共享資料和資訊。這些機制包括rpc com ole dde 訊息 剪下板 郵件槽 管道 套接字等。但是,如果在同一臺機器...