1. 程式人生 > >程序間通訊方式總結(windows 和linux)

程序間通訊方式總結(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程序間通訊方式

來自: http://hi.baidu.com/sinbh/blog/item/a3d386d145bec23f9b5027a9.html
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平臺的單機環境下。

相關推薦

程序通訊方式總結windows linux

平時看的書很多,瞭解的也很多,但不喜歡總結,這不昨天面試的時候被問到了程序間通訊的方式,因為沒有認真總結過,所以昨天答得不是特別好。現在將linux和windows的程序間通訊方式好好總結一下。           windows的程序間的通訊方式有1.檔案對映;2. 共

程序通訊方式總結適用初學者

前言:linux的程序間通訊概述 1、為什麼需要程序間通訊       (1)程序間通訊(IPC)指的是2個任意程序之間的通訊。       (2)同一個程序在一個地址空間中,所以同一個程序的不同模組(不同函式、不同檔案)之間都是很簡單的(很多時候都是全域性變數、也可以通

程序通訊方式總結——管道

         Linux/Unix系統IPC是各種程序間通訊方式的統稱,但是其中極少能在所有Linux/Unix系統實現中進行移植。隨著POSIX和Open Group(X/Open)標準化的推

程序通訊方式總結——訊息佇列

        Linux/Unix系統IPC是各種程序間通訊方式的統稱,但是其中極少能在所有Linux/Unix系統實現中進行移植。隨著POSIX和Open Group(X/Open)標準化的推進

linux 程序通訊方式總結

對linux 程序通訊的一點簡單總結,主要包括 管道通訊,還有 system v, posix 標準的 訊息佇列,訊號量,共享記憶體方式。 基於管道的通訊主要包括有名管道,和無名管道,所謂的有名管道,就是建立的時候會帶有具體的標識,以便於確認對誰操作,而無名管道是建立沒有名字的管道,

Linux 程序通訊方式 pipe函式

Linux 程序間通訊方式有以下幾種: 1-》管道(pipe)和有名管道(fifo). 2-》訊息佇列 3-》共享記憶體 4-》訊號量 5-》訊號(signal) 6-》套接字(sicket) 在這裡我們看一下第一種====管道(pipe)。有名管道(fifo)見其它文章。

Android程序通訊 - Socket使用TCP、UDP

在使用Socket實現程序間通訊前,先對網路協議相關知識進行簡單回顧。 網路分層 一般情況會將網路分為5層: 應用層     常見協議:HTTP、FTP、POP3等 傳輸層     

python呼叫phantomjs元件windowslinux

phantomjs在windows和linux系統,可以通selenium的webdriver直接呼叫,所以只要將phantomjs程式載入到python程式目錄下。   示例程式碼如下所示:#建立Phantomjs瀏覽器物件,括號裡是phanto

重新定位svn地址的方法windowslinux,svn switch(sw)的幫助資訊

今天公司的路由器出現問題,伺服器的IP地址也跟著變了,但是原來的svn已經設定好了,現在需要更換地址 查詢原地址的方法: [email protected]:codes# svn info 路徑: . URL: http://192.168.1.58/repos

C/C++獲取作業系統、CPU、記憶體資訊、硬碟、IPMACwindowslinux

有時候需要在工程裡面獲取一些系統或者硬體的資訊,比如系統版本,cpu,記憶體,顯示卡,硬碟,網路等,作為後續軟體功能判斷的依據,甚至參與效能演算法自適應建模 Windows 作業系統和記憶體資訊在windows下通過系統的API來獲取,CPU資訊則需要需要通過底層CPUI

程序通訊方式多執行緒同步機制總結

多程序之間通訊方式:           檔案對映:本地之間           共享記憶體:本地之間           匿名管道:本地之間           命名管道:跨伺服器           郵件槽:一對多的傳輸資料,通常通過網路向一臺Windo

Android基礎學習之程序執行緒通訊方式總結

        首先介紹一下程序和執行緒的基本概念及兩者之間的區別:   程序:是具有一定獨立功能的程式關於某個資料集合上的一次執行活動,程序是系統進行資源分配和排程的一個獨立單位。   執行緒:是程序的一個實體,是CPU排程和分派的基本單位,它是比程序更小的能獨立執行的基本

程序通訊——共享記憶體Shared Memory簡易原理建立_獲得函式

共享記憶體是System V版本的最後一個程序間通訊方式。共享記憶體,顧名思義就是允許兩個不相關的程序訪問同一個邏輯記憶體,共享記憶體是兩個正在執行的程序之間共享和傳遞資料的一種非常有效的方式。不同程序之間共享的記憶體通常為同一段實體記憶體。程序可以將同一段實體記憶體連線到他們自己的地址空間中,所有

程序通訊方式-----訊息佇列

訊息佇列 訊息佇列,是訊息的連結表,存放在核心中。一個訊息佇列由一個識別符號(即佇列ID)來標識。使用者程序可以向訊息佇列新增訊息,也可以向訊息佇列讀取訊息。 同管道檔案相比,訊息佇列中的每個訊息指定特定的訊息型別,接收的時候可以不需要按照佇列次序讀取,可以根據自定義型別

程序通訊方式——訊號量Semaphore

1.訊號量 訊號量本質上是一個計數器(不設定全域性變數是因為程序間是相互獨立的,而這不一定能看到,看到也不能保證++引用計數為原子操作),用於多程序對共享資料物件的讀取,它和管道有所不同,它不以傳送資料為主要目的,它主要是用來保護共享資源(訊號量也屬於臨界資源

系統通訊方式Kafka的實際使用場景使用方案二十三

5、場景應用——電商平臺:瀏覽記錄收集功能 事件/日誌收集系統是大中型軟體不得不面對的話題。目前第三方業務系統對 事件/日誌收集系統 的整合思路主要有兩大類:侵入式收集方案和非侵入式收集方案。侵入式收集方案,是指任何需要使用事件/日誌收集系統的第三方系統,都需要做有針對的編碼工作,這個編碼工作或

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

# 管道( pipe ):管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。 # 有名管道 (namedpipe) : 有名管道也是半雙工的通訊方式,但是它允許無親緣關係程序間的通訊。 # 訊號量(semophore ) : 訊號量是一個計數

Android——IPC機制程序通訊方式

在上一章中,我們已經介紹了IPC的幾個基礎知識:序列化和Binder,本章將詳細介紹各種跨程序同行方式。具體的方式有很多,比如可以通過在Intent中附加extras來傳遞資訊,或者通過共享檔案的方式來共享資料,還可以採用Binder的方式來跨程序通訊,另外Co

Linux程序/執行緒通訊方式總結

Linux系統中的程序間通訊方式主要以下幾種: 同一主機上的程序通訊方式    * UNIX程序間通訊方式: 包括管道(PIPE), 有名管道(FIFO), 和訊號(Signal)    * System V程序通訊方式:包括訊號量(Semaphore), 訊息佇列

linux 程序通訊方式

1 無名管道通訊 無名管道( pipe ):管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。 2 高階管道通訊 高階管道(popen):將另一個程式當做一個新的程序在當前程式程序中啟動,則它算是當前程式的子程序