1. 程式人生 > >程序間通訊的幾種方式的介紹及比較

程序間通訊的幾種方式的介紹及比較

程序間通訊 就是在不同程序之間傳播或交換資訊,那麼不同程序之間存在著什麼雙方都可以訪問的介質呢?程序的使用者空間是互相獨立的,一般而言是不能互相訪問的,唯一的例外是共享記憶體區。但是,系統空間卻是“公共場所”,所以核心顯然可以提供這樣的條件。除此以外,那就是雙方都可以訪問的外設了。在這個意義上,兩個程序當然也可以通過磁碟上的普通檔案交換資訊,或者通過“登錄檔”或其它資料庫中的某些表項和記錄交換資訊。廣義上這也是程序間通訊的手段,但是一般都不把這算作“程序間通訊”。因為那些通訊手段的效率太低了,而人們對程序間通訊的要求是要有一定的實時性。

一.Linux下程序間通訊的幾種主要手段簡介:

1.

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

管道包括三種:1)普通管道PIPE, 通常有種限制,一是半雙工,只能單向傳輸;二是隻能在父子程序間使用. 2)流管道s_pipe: 去除了第一種限制,可以雙向傳輸. 3)命名管道:name_pipe, 去除了第二種限制,可以在許多並不相關的程序之間進行通訊.

2.訊號(Signal):訊號是比較複雜的通訊方式,用於通知接受程序有某種事件發生,除了用於程序間通訊外,程序還可以傳送訊號給程序本身;Linux除了支援Unix早期訊號語義函式sigal外,還支援語義符合Posix.1標準的訊號函式sigaction(實際上,該函式是基於BSD的,BSD為了實現可靠訊號機制,又能夠統一對外介面,用sigaction函式重新實現了signal函式);

3.報文(Message)佇列(訊息佇列):訊息佇列是訊息的連結表,包括Posix訊息佇列systemV訊息佇列。有足夠許可權的程序可以向佇列中新增訊息,被賦予讀許可權的程序則可以讀走佇列中的訊息。訊息佇列克服了訊號承載資訊量少,管道只能承載無格式位元組流以及緩衝區大小受限等缺點。

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

5.訊號量(semaphore):主要作為程序間以及同一程序不同執行緒之間的同步手段。

6.套介面(Socket):

更為一般的程序間通訊機制,可用於不同機器之間的程序間通訊。起初是由Unix系統的BSD分支開發出來的,但現在一般可以移植到其它類Unix系統上:Linux和System V的變種都支援套接字。

二.相關問題

FAQ1: 管道與檔案描述符,檔案指標的關係?

答: 其實管道的使用方法與檔案類似,都能使用read,write,open等普通IO函式. 管道描述符類似於檔案描述符. 事實上, 管道使用的描述符, 檔案指標和檔案描述符最終都會轉化成系統中SOCKET描述符. 都受到系統核心中SOCKET描述符的限制. 本質上LINUX核心原始碼中管道是通過空檔案來實現.

FAQ2: 管道的使用方法?

答: 主要有下面幾種方法: 1)pipe, 建立一個管道,返回2個管道描述符.通常用於父子程序之間通訊. 2)popen, pclose: 這種方式只返回一個管道描述符,常用於通訊另一方是stdin or stdout; 3)mkpipe: 命名管道, 在許多程序之間進行互動.

FAQ3: 管道與系統IPC之間的優劣比較?

答: 管道: 優點是所有的UNIX實現都支援, 並且在最後一個訪問管道的程序終止後,管道就被完全刪除;缺陷是管道只允許單向傳輸或者用於父子程序之間.

系統IPC: 優點是功能強大,能在毫不相關程序之間進行通訊; 缺陷是關鍵字KEY_T使用了核心標識,佔用了核心資源,而且只能被顯式刪除,而且不能使用SOCKET的一些機制,例如select,epoll等.

FAQ4: WINDOS程序間通訊與LINUX程序間通訊的關係?

答: 事實上,WINDOS的程序通訊大部分移植於UNIX, WINDOS的剪貼簿,檔案對映等都可從UNIX程序通訊的共享儲存中找到影子.

FAQ5: 程序間通訊與執行緒間通訊之間的關係?

答: 因為WINDOWS執行的實體是執行緒, 狹義上的程序間通訊其實是指分屬於不同程序的執行緒之間的通訊.而單個程序之間的執行緒同步問題可歸併為一種特殊的程序通訊.它要用到核心支援的系統呼叫來保持執行緒之間同步. 通常用到的一些執行緒同步方法包括:Event, Mutex, 訊號量Semaphore, 臨界區資源等.

轉載自:http://blogold.chinaunix.net/u3/94667/showart_2263949.html