程序間通訊之我見

2022-08-21 05:00:11 字數 2414 閱讀 6387

程序間通訊之我見

windows系統程序間通訊

windows提供了多種機制,使得應用程式之間能夠快速、方便地共享資料和資訊。這些機制包括rpc、com、ole、dde、訊息、剪下板、郵件槽、管道、套接字等。但是,如果在同一臺機器上的多個程序間進行通訊的話,那麼上面的機制都與共享記憶體有關。這在windows上稱作記憶體對映檔案。

這種資料共享機制是通過讓兩個或多個程序對映同一檔案對映物件的檢視來實現,這意味著程序間共享相同的物理儲存頁面。因此,當乙個程序在檔案對映物件的檢視中寫入資料時,其他的程序會在它們的檢視中立刻看到變化。但是,對多個程序共享同乙個檔案對映物件來說,所有程序使用的檔案對映物件的名稱必須完全相同[1]。

linux系統程序間通訊

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

其中,最初unix ipc包括:管道、fifo、訊號;system v ipc包括:system v訊息佇列、system v訊號燈、system v共享記憶體區;posix ipc包括: posix訊息佇列、posix訊號燈、posix共享記憶體區。有兩點需要簡單說明一下:1)由於unix版本的多樣性,電子電氣工程協會(ieee)開發了乙個獨立的unix標準,這個新的ansi unix標準被稱為計算機環境的可移植性作業系統介面(psoix)。現有大部分unix和流行版本都是遵循posix標準的,而linux從一開始就遵循posix標準;2)bsd並不是沒有涉足單機內的程序間通訊(socket本身就可以用於單機內的程序間通訊)。事實上,很多unix版本的單機ipc留有bsd的痕跡,如4.4bsd支援的匿名記憶體對映、4.3+bsd對可靠訊號語義的實現等等[2]。

linux下的程序間通訊機制大致包括:管道、訊號(在windows上成為訊息)、訊號佇列(實際是訊息鍊錶)、共享記憶體、訊號量、套接字。

共同點

由上面的分析可以看出兩個作業系統共有的且用的較多的程序間通訊機制有:管道、訊息、共享記憶體和套接字。簡介如下:

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

訊號或者訊息(signal):訊號是比較複雜的通訊方式,用於通知接受程序有某種事件發生,除了用於程序間通訊外,程序還可以傳送訊號給程序本身。

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

套介面(socket):更為一般的程序間通訊機制,可用於不同機器之間的程序間通訊。

總結

訊息佇列是訊息的鏈結表,訊息佇列克服了訊號承載資訊量少,管道只能承載無格式位元組流以及緩衝區大小受限等缺點;而訊號量主要作為程序間以及同一程序不同執行緒之間的同步手段。

個人認為:管道、剪貼簿、共享記憶體都是基於共享記憶體的方式。而訊息、訊息佇列和套接字的都是基於發訊息的機制,只是看是在同乙個機器上發還是在網路中發訊息而已(套接字可以看做在網路中傳送訊息)。至於rpc、com、ole、dde主要是在客戶端和伺服器端生成乙個統一的介面。也就是說這幾個通訊手段其實就相當於網路上的協議。在同一層通訊的協議不管下一層,好像這兩層直接建立了聯絡。這個基本的思想是在本地建立類似存根**的**,而在遠端建立類似樁**的**來進行連線。

這上面的通訊方式中,剪下板和匿名管道只能實現同一機器上兩個程序間的通訊,而訊號量、訊息、訊息佇列和共享記憶體也只能在同一臺機器上的多個程序間通訊;但是命名管道、郵件槽和套接字不僅可以實現同一機器上的兩個程序的通訊,還可以實現跨網路的程序間通訊;另外,油槽和套接字可以實現一對多的通訊,而命名管道只能是點對點的單一通訊,但油槽的缺點是資料量較小,通常都是在424位元組以下,如果資料量較大,則可以採用命名管道和套接字的方式來完成。綜上:在跨網路通訊中套接字無疑是最優秀的通訊方式,這或許是伯克利開發套接字來進行網路通訊的初衷吧(傳統通訊方式不好用)。

[1]  windows核心程式設計. jeffrey richter christophe nasarre著

[2]  unix環境高階程式設計. w.richard stevens stephen a.rago著

php程序間通訊 yoc PHP程序間通訊

php是用c編寫的,因此它對系統底層api的操作與c很像,同大多數語言一樣,php程序間通訊的方式有以下幾種 訊息佇列,管道,共享記憶體,socket和訊號。本文是對這幾種通訊方式對整理 管道通訊pipe 管道用於承載簡稱之間的通訊資料。為了方便理解,可以將管道比作檔案,程序a將資料寫到管道p中,然...

程序間通訊

實現程序間資料共享除了常用的記憶體檔案對映外,對於一些非檔案的資料共享可以直接使用wm copydata。如果需要在程序a傳遞資料到程序b,簡單的實現如下 在程序a中 cstring strdatatosend t hello 需要傳遞的資料 hwnd hwndreceived 程序b的接收資料視窗...

程序間通訊

最近做專案遇到奇怪的問題,我在主線程中建立乙個工作執行緒。在工作執行緒中用sendmessage向主線程傳送訊息,通知主線程操作office 物件。getactiveobject時提示 hr 0x8001010d 因為應用程式正在傳送乙個輸入同步呼叫,所以無法執行傳出的呼叫。我把sendmessag...