天天看點

Window & Linux 程序間通信方式(IPC)

Windows平台下的IPC:http://blog.csdn.net/bjtbjt/article/details/7044266

File Mapping(檔案映射)

Shared Memory(共享記憶體):實質上是檔案映射的一種特殊情況

Anonymous Pipe(匿名管道):在有親緣關系的程序間進行通信

Named Pipe(命名管道):可以在不相關程序之間和不同計算機之間使用

Mailslots(郵件槽):提供程序間單向通信能力,任何程序都能建立郵件槽成為郵件槽伺服器,建立多個郵件槽可以實作程序間雙向通信

Clipped Board(剪貼闆):實質上是Win32 API中一族用來傳輸資料的函數和消息,不能在網絡上使用

DDE(動态資料交換):是使用共享記憶體在應用程式之間進行資料交換的一種程序間通信形式

OLE(對象連接配接于嵌入):一般用于管理複合文檔,即由多種資料格式組成的文檔

DDL(動态連接配接庫):DDL中的全局資料可以被調用DDL的所有程序共享,但是并不提倡這種方法,使用帶有通路權限控制的共享記憶體方法更好

RPC(遠端過程調用):可以在網絡上使用RPC進行程序通信,就像函數調用那樣簡單

Socket(套接字):越來越多的程式在使用這個方式,主要優點就是跨平台,且支援功能很全面

WM_COPYDATA(message視窗消息機制):程序間使用SendMessage來發送消息讓對方來處理,它在底層上實際上是通過檔案映射來實作的,并且隻能用于Windows平台的單機環境下,通信程序必須都有視窗

Event(事件機制):是一個核心對象,可以用于不同程序間的同步控制

信号量:對系統共享資源的通路控制

Win32 API提供了如此多的程序間通信方案,在選擇的時候一般需要考慮如下因素:

1. 應用程式是在網絡環境下還是在單機環境下

2. 是否需要跨平台

3. 是否具有windows視窗

4. 通信程序是否相關(如:是否具有親緣關系)

Linux平台下的IPC:http://blog.sina.com.cn/s/blog_715342470100s558.html

http://www.cnblogs.com/mydomain/archive/2010/09/23/1833369.html

http://blog.sina.com.cn/s/blog_6002b97001013wec.html

管道和命名管道:和Windows下的匿名管道作用相似,但是它是半雙工的

信号:是在軟體層次上對中斷機制的一種模拟,在原理上一個程序收到一個信号與處理器收到一個中斷請求可以說是一樣的,信号事件可以有兩個來源:硬體來源和軟體來源(如kill,raise,alarm以及一些非法運算操作等)

信号燈(信号量):它主要提供對程序間共享資源的通路控制,主要是進行同步控制

消息隊列:随核心持續,隻有在核心重新開機或者顯式删除一個消息隊列時,該消息隊列才會被真正删除。它就是一個消息的連結清單,克服了信号傳遞資訊少,管道隻能承載無格式位元組流及緩沖區大小受限的缺點

共享記憶體:是最有用的也是最快的IPC方式,共享記憶體的意思就是同一塊實體記憶體被映射到不同程序的程序位址空間,不同程序可以即時看到共享記憶體中的資料更新,由于共享是以在通路的時候需要進行某種互斥和同步的控制

套接字:跨平台,使用很廣泛

Windows和linux平台下IPC機制的共同點:

1. 都有管道和命名管道

2. Linux的信号和Windows的消息或事件機制

3. 共享記憶體

4. 套接字

總結

1. 消息隊列時消息的連結清單,克服了信号承載資訊量少,管道隻能承載無格式位元組流及緩沖區大小受限的缺點

2. 信号量主要作為程序間以及同一程序的不同線程之間的同步手段

3. 管道、剪貼闆、共享記憶體都是基于共享記憶體的方式;而消息、消息隊列、事件和套接字都是基于發消息的機制,隻是看是在同一台機器上發送還是在網絡中發送消息(套接字是在網絡中發送消息)

4. RCP、COM、OLE、DDE主要是在用戶端和伺服器端生成一個統一的接口,這幾個手段相當于網絡上的協定,在同一層通信的協定不管下一層,好像是這兩層直接建立了聯系。

5. 剪切闆、匿名管道隻能實作統一機器上的兩個程序間的通信;信号量、消息、消息隊列和共享記憶體隻能在同一機器上的多個程序間通信;命名管道、郵件槽和套接字不僅可以實作統一機器上的兩個程序的通信,還可以實作跨網絡的程序間通信(各個具體應用之間,一般每個應用都會對應一個端口号和網絡進行通信);此外,郵件槽和套接字可以實作一對多的通信,而命名管道隻能是點對點的單一通信,郵件槽的缺點就是資料量較小。

在跨網絡的通信中,套接字無疑是最優秀的通信方式

繼續閱讀