天天看點

程序間通信方式對比

UNIX 為實作這樣的程序間通信 提供了多種技術。一些技術提供同一主機上的程序間通信,其他技術可以實作主機到主機的資訊交換。另外,各種技術的速度不同,是以必須選擇最合适自己需求的技術。還必須進行協調(實施時間控制和排他控制)。例如,如果一個應用程式産生資料,另一個應用程式消費資料,那麼當讀完共享池時消費者必須停下來等待生産者。另一方面,如果消費者無法足夠快地讀取池,生産者必須慢下來或暫停。

表 1 總結在典型的 UNIX 系統上可用的程序間通信形式。

表 1. UNIX 中的程序間通信
名稱 說明 範圍 用途
檔案 在典型的 UNIX 檔案中讀寫資料。任意數量的程序都可以互操作。 本地 共享大資料集
管道 使用專用的檔案描述符在兩個程序之間傳輸資料。通信隻在父程序和子程序之間進行。 本地 簡單的資料共享,比如生産者和消費者
命名管道 通過專用的檔案描述符在程序之間交換資料。通信可以在同一主機上的任意兩個對等程序之間進行。 本地 生産者和消費者或指令-控制,比如 MySQL 和它的指令行查詢工具
信号 通過中斷通知應用程式某一情況。 本地 無法在信号中傳輸資料,是以信号主要用于程序管理
共享記憶體 通過在同一記憶體段中讀寫資料共享資訊。 本地 任何類型的協作,尤其适合需要安全性的情況
套接字 完成特殊的設定過程之後,使用一般的輸入/輸出操作傳輸資料。 本地或遠端 FTP、ssh 和 Apache Web Server 等網絡服務

正如前面提到的,每種技術滿足不同的需求。假設多個程序之間的協作的複雜性大體相當,每種方法的優點和缺點如下:

  • 1、通過一般的 UNIX 檔案共享資料很簡單,因為它使用大家熟悉的檔案操作。但是,通過檔案系統共享資料很慢,因為磁盤輸入和輸出操作的效率遠遠比不上記憶體。另外,隻通過檔案讀寫資料很難協調。最後,在檔案中儲存敏感資料是不安全的,因為根使用者和擁有特權的其他使用者可以通路這些資訊。對于隻讀或隻寫的資料,适合使用檔案。
  • 2、管道和命名管道也很簡單。它們在連接配接的兩端使用兩個标準的檔案描述符 — 一個隻執行讀操作,另一個隻執行寫操作。但是,管道隻能在父程序和子程序之間使用,不能在任意兩個程序之間使用。命名管道克服了這個缺點,是在同一系統上交換資料的好方法。但是,管道和命名管道都不提供随機通路,因為它們都作為先入先出 (FIFO) 裝置。
  • 3、信号無法在程序之間傳輸資料。一般情況下,信号應該隻用于在程序之間通知異常情況。
  • 4、共享記憶體适合比較大的資料集,因為它使用記憶體,支援快速的随機通路。共享記憶體的實作有點兒複雜,盡管如此,對于多個程序之間的主機内 協作,共享記憶體是不錯的方法。
  • 5、套接字的功能與命名管道很相似,但是可以跨主機。本地套接字 (也稱為 UNIX 套接字)隻能進行本地(同一主機上的)連接配接。Inet 和 Inet6 套接字分别使用 IPv4 和 IPv6 協定,它們接受遠端連接配接(也可以通過本地機器的 Internet 尋址機制接受本地連接配接)。網絡應用程式顯然應該選擇套接字,比如分布式處理或 web 浏覽器。所需的代碼比命名管道複雜一點兒,但是模式是固定的,在任何 UNIX 網絡程式設計書中都有介紹。

繼續閱讀