程序間通訊方式總結(windows 和linux)
平時看的書很多,瞭解的也很多,但不喜歡總結,這不昨天面試的時候被問到了程序間通訊的方式,因為沒有認真總結過,所以昨天答得不是特別好。現在將linux和windows的程序間通訊方式好好總結一下。
windows的程序間的通訊方式有1.檔案對映;2. 共享記憶體(是檔案對映的一種特殊情況);3.郵件槽(mailslot)(點對點訊息佇列); 4.匿名管道;5;命名管道; 6. 剪貼簿;7.動態資料交換;8.物件連結與嵌入;9.遠端過程呼叫;10.動態連結庫;11.socket;12.WM_COPYDATA .linux程序間通訊的方式有:1.管道 2.訊號量 3.共享記憶體 4.訊息佇列 5.套接字 6.訊號
windows和linux共有的程序間通訊方式:1. 訊息(linux中叫做訊號) 2. 共享記憶體 3. 郵槽 4. 管道 5.socket
Windows程序間通訊方式
Windows程序間通訊方式
1 檔案對映
檔案對映(Memory-Mapped Files)能使程序把檔案內容當作程序地址區間一塊記憶體那樣來對待。因此,程序不必使用檔案I/O操作,只需簡單的指標操作就可讀取和修改檔案的內容。
Win32 API允許多個程序訪問同一檔案對映物件,各個程序在它自己的地址空間裡接收記憶體的指標。通過使用這些指標,不同程序就可以讀或修改檔案的內容,實現了對檔案中資料的共享。
應用程式有三種方法來使多個程序共享一個檔案對映物件。
(1)繼承:第一個程序建立檔案對映物件,它的子程序繼承該物件的控制代碼。
(2)命名檔案對映:第一個程序在建立檔案對映物件時可以給該物件指定一個名字(可與檔名不同)。第二個程序可通過這個名字開啟此檔案對映物件。另外,第一個程序也可以通過一些其它IPC機制(有名管道、郵件槽等)把名字傳給第二個程序。
(3)控制代碼複製:第一個程序建立檔案對映物件,然後通過其它IPC機制(有名管道、郵件槽等)把物件控制代碼傳遞給第二個程序。第二個程序複製該控制代碼就取得對該檔案對映物件的訪問許可權。
檔案對映是在多個程序間共享資料的非常有效方法,有較好的安全性。但檔案對映只能用於本地機器的程序之間,不能用於網路中,而開發者還必須控制程序間的同步。
2 共享記憶體
Win32 API中共享記憶體(Shared Memory)實際就是檔案對映的一種特殊情況。程序在建立檔案對映物件時用0xFFFFFFFF來代替檔案控制代碼(HANDLE),就表示了對應的檔案映 射物件是從作業系統頁面檔案訪問記憶體,其它程序開啟該檔案對映物件就可以訪問該記憶體塊。由於共享記憶體是用檔案對映實現的,所以它也有較好的安全性,也只能 運行於同一計算機上的程序之間。
3 匿名管道
管道(Pipe)是一種具有兩個端點的通訊通道:有一端控制代碼的程序可以和有另一端控制代碼的程序通訊。管道可以是單向-一端是隻讀的,另一端點是隻寫的;也可以是雙向的一管道的兩端點既可讀也可寫。
匿 名管道(Anonymous Pipe)是 在父程序和子程序之間,或同一父程序的兩個子程序之間傳輸資料的無名字的單向管道。通常由父程序建立管道,然後由要通訊的子程序繼承通道的讀端點控制代碼或寫 端點控制代碼,然後實現通訊。父程序還可以建立兩個或更多個繼承匿名管道讀和寫控制代碼的子程序。這些子程序可以使用管道直接通訊,不需要通過父程序。
匿名管道是單機上實現子程序標準I/O重定向的有效方法,它不能在網上使用,也不能用於兩個不相關的程序之間。
4 命名管道
命 名管道(Named Pipe)是伺服器程序和一個或多個客戶程序之間通訊的單向或雙向管道。不同於匿名管道的是命名管道可以在不相關的程序之間和不同計算機之間使用,伺服器 建立命名管道時給它指定一個名字,任何程序都可以通過該名字開啟管道的另一端,根據給定的許可權和伺服器程序通訊。
命名管道提供了相對簡單的程式設計介面,使通過網路傳輸資料並不比同一計算機上兩程序之間通訊更困難,不過如果要同時和多個程序通訊它就力不從心了。
5 郵件槽
郵件槽(Mailslots)提供程序間單向通訊能力,任何程序都能建立郵件槽成為郵件槽伺服器。其它程序,稱為郵件槽客戶,可以通過郵件槽的名字給郵件槽伺服器程序傳送訊息。進來的消 息一直放在郵件槽中,直到伺服器程序讀取它為止。一個程序既可以是郵件槽伺服器也可以是郵件槽客戶,因此可建立多個郵件槽實現程序間的雙向通訊。
通過郵件槽可以給本地計算機上的郵件槽、其它計算機上的郵件槽或指定網路區域中所有計算機上有同樣名字的郵件槽傳送訊息。廣播通訊的訊息長度不能超過400位元組,非廣播訊息的長度則受郵件槽伺服器指定的最大訊息長度的限制。
郵 件槽與命名管道相似,不過它傳輸資料是通過不可靠的資料報(如TCP/IP協議中的UDP包)完成的,一旦網路發生錯誤則無法保證訊息正確地接收,而命名 管道傳輸資料則是建立在可靠連線基礎上的。不過郵件槽有簡化的程式設計介面和給指定網路區域內的所有計算機廣播訊息的能力,所以郵件槽不失為應用程式傳送和接 收訊息的另一種選擇。
6 剪貼簿
剪貼簿(Clipped Board)實質是Win32 API中一組用來傳輸資料的函式和訊息,為Windows應用程式之間進行資料共享提供了一箇中介,Windows已建立的剪下(複製)-貼上的機制為不 同應用程式之間共享不同格式資料提供了一條捷徑。當用戶在應用程式中執行剪下或複製操作時,應用程式把選取的資料用一種或多種格式放在剪貼簿上。然後任何 其它應用程式都可以從剪貼簿上拾取資料,從給定格式中選擇適合自己的格式。
剪貼簿是一個非常鬆散的交換媒介,可以支援任何資料格式,每一 格式由一無符號整數標識,對標準(預定義)剪貼簿格式,該值是Win32 API定義的常量;對非標準格式可以使用Register Clipboard Format函式註冊為新的剪貼簿格式。利用剪貼簿進行交換的資料只需在資料格式上一致或都可以轉化為某種格式就行。但剪貼簿只能在基於Windows的 程式中使用,不能在網路上使用。
7 動態資料交換
動態資料交換(DDE)是使用共享記憶體在應用程式之間進行資料交換的一種程序間通訊形式。應用程式可以使用DDE進行一次性資料傳輸,也可以當出現新資料時,通過傳送更新值在應用程式間動態交換資料。
DDE 和剪貼簿一樣既支援標準資料格式(如文字、點陣圖等),又可以支援自己定義的資料格式。但它們的資料傳輸機制卻不同,一個明顯區別是剪貼簿操作幾乎總是用作 對使用者指定操作的一次性應答-如從選單中選擇Paste命令。儘管DDE也可以由使用者啟動,但它繼續發揮作用一般不必使用者進一步干預。DDE有三種資料交 換方式:
(1) 冷鏈:資料交換是一次性資料傳輸,與剪貼簿相同。
(2) 溫鏈:當資料交換時伺服器通知客戶,然後客戶必須請求新的資料。
(3) 熱鏈:當資料交換時伺服器自動給客戶傳送資料。
DDE交換可以發生在單機或網路中不同計算機的應用程式之間。開發者還可以定義定製的DDE資料格式進行應用程式之間特別目的IPC,它們有更緊密耦合的通訊要求。大多數基於Windows的應用程式都支援DDE。
8 物件連線與嵌入
應 用程式利用物件連線與嵌入(OLE)技術管理複合文件(由多種資料格式組成的文件),OLE提供使某應用程式更容易呼叫其它應用程式進行資料編輯的服務。 例如,OLE支援的字處理器可以巢狀電子表格,當用戶要編輯電子表格時OLE庫可自動啟動電子表格編輯器。當用戶退出電子表格編輯器時,該表格已在原始字 處理器文件中得到更新。在這裡電子表格編輯器變成了字處理器的擴充套件,而如果使用DDE,使用者要顯式地啟動電子表格編輯器。
同DDE技術相同,大多數基於Windows的應用程式都支援OLE技術。
9 動態連線庫
Win32動態連線庫(DLL)中的全域性資料可以被呼叫DLL的所有程序共享,這就又給程序間通訊開闢了一條新的途徑,當然訪問時要注意同步問題。
雖然可以通過DLL進行程序間資料共享,但從資料安全的角度考慮,我們並不提倡這種方法,使用帶有訪問許可權控制的共享記憶體的方法更好一些。
10 遠端過程呼叫
Win32 API提供的遠端過程呼叫(RPC)使應用程式可以使用遠端呼叫函式,這使在網路上用RPC進行程序通訊就像函式呼叫那樣簡單。RPC既可以在單機不同程序間使用也可以在網路中使用。
由 於Win32 API提供的RPC服從OSF-DCE(Open Software Foundation Distributed Computing Environment)標準。所以通過Win32 API編寫的RPC應用程式能與其它作業系統上支援DEC的RPC應用程式通訊。使用RPC開發者可以建立高效能、緊密耦合的分散式應用程式。
11 NetBios函式
Win32 API提供NetBios函式用於處理低階網路控制,這主要是為IBM NetBios系統編寫與Windows的介面。除非那些有特殊低階網路功能要求的應用程式,其它應用程式最好不要使用NetBios函式來進行程序間通訊。
12 Sockets
Windows Sockets規範是以U.C.Berkeley大學BSD UNIX中流行的Socket介面為範例定義的一套Windows下的網路程式設計介面。除了Berkeley Socket原有的庫函式以外,還擴充套件了一組針對Windows的函式,使程式設計師可以充分利用Windows的訊息機制進行程式設計。
現在通 過Sockets實現程序通訊的網路應用越來越多,這主要的原因是Sockets的跨平臺性要比其它IPC機制好得多,另外WinSock 2.0不僅支援TCP/IP協議,而且還支援其它協議(如IPX)。Sockets的唯一缺點是它支援的是底層通訊操作,這使得在單機的程序間進行簡單數 據傳遞不太方便,這時使用下面將介紹的WM_COPYDATA訊息將更合適些。
13 WM_COPYDATA訊息
WM_COPYDATA 是一種非常強大卻鮮為人知的訊息。當一個應用向另一個應用傳送資料時,傳送方只需使用呼叫SendMessage函式,引數是目的視窗的控制代碼、傳遞資料的 起始地址、WM_COPYDATA訊息。接收方只需像處理其它訊息那樣處理WM_COPY DATA訊息,這樣收發雙方就實現了資料共享。
WM_COPYDATA是一種非常簡單的方法,它在底層實際上是通過檔案對映來實現的。它的缺點是靈活性不高,並且它只能用於Windows平臺的單機環境下。