linux 進程間通信簡介(IPC)

參考文章

《Linux環境下C編程指南》 楊樹青 王歡

IBM developerWorks®上有很棒的說明:
http://www.ibm.com/developerworks/cn/linux/l-ipc/part5/index2.html

引文

進程間通信(IPC)是用於處理一個多進程系統中各個進程之間的協調。所謂進程間通信,就是指多個進程之間相互通信,交換信息的方法。常見的進程間通信的方法包括以下幾種。

  • 共享內存
  • 信號量
  • 管道
  • 命名管道
  • 消息隊列
  • 套接口
  • 全雙工管道

其中,共享內存、信號量、消息隊列、管道和命名管道只適用於本地進程間通信,套接口和全雙工管道則可以用於遠程通信,因而一般用於網絡編程。

共享內存

共享內存是linux系統中最底層的通信機制,也是最快速的通信機制。共享內存通過兩個或多個進程共享同一塊內存區域來實現進程間的通信。 通常是由一個進程創建一塊共享內存區域,然後多個進程可以對其進行訪問,一個進程要傳出的數據存放到共享內存中,另一個或多個進程則直接從共享內存中讀取數據。因此這種通信方式是最高效的進程間通信方式。但實際的問題在於,當兩個或多個進程使用共享內存進行通信時,同步問題的解決顯得尤爲重要,否則就會造成因不同進程同時讀寫一塊共享內存中的數據而發生混亂。在通常的情況下,通過使用信號量來實現進程的同步。

信號量

信號量是一種用於多個進程訪問共享資源進行控制的機制。共享資源通常可以分爲兩大類:一類是互斥共享資源,即任一時刻只允許一個進程訪問該資源;一類是同步共享資源,同一時刻允許多個進程訪問該資源。
信號量是爲了解決互斥資源的同步問題而引入的機制。簡單來說,信號量的實質是整數計數器,其中記錄了可供訪問的共享資源的單元個數。
當有進程要求使用某一資源時,系統首先要檢測該資源的信號量,如果該資源的信號量的值大於0.則進程可以使用這一資源,同時信號量的值減1。進程對資源訪問結束時,信號量的值加1。如果該資源的信號量的值等於0,則進程休眠,直至信號量的值大於0時進程被喚醒,訪問該資源。
信號量中一種常見的形式是雙態信號量。雙態信號量對應於只有一個可供訪問單元的互斥共享資源,它的初始值被設置爲1,任意時刻至多隻允許一個進程對資源進行訪問。

管道通信(pipe)

在linux系統中,管道是一種特殊的文件,它的主要用途是實現進程間的通信。
管道的一個顯著特點是:當一個管道建立後,將獲得兩個文件描述符,分別用於對管道的讀取和寫入,通常將其稱爲管道的寫入端和管道的讀取端,從寫入端寫入管道的任何數據都可以從讀取端讀取。對一個進程來說,管道的寫入和讀取操作與寫入和讀取一個普通文件沒有區別,只是在內核中通過這種機制來實現進程間的通信。
和前面介紹的共享內存相比,管道機制要稍慢一些,但是管道使用起來比共享內存要方便得多。
管道雖然使用的十分廣泛,但也有其固有的侷限性。管道智能用於兩個進程間的通信,而不能用於多個進程。而且這兩個進程要有同源性,即它們必須是最終由同一個進程所派生出的進程。此外,管道是半雙工方式的,即只允許單方線傳輸數據。

命名管道(FIFO)

命名管道(FIFO)又稱先入先出隊列,是一種特殊的管道,存在於文件系統中。

管道與命名管道的相同點與區別

  • 命名管道可以用於任何兩個進程間的通信,而並不限制這兩個進程同源,這是與管道最顯著的區別,因此命名管道的使用要比管道的使用要靈活得多。
  • 命名管道作爲一種特殊的文件存放於文件系統中,而不是像管道一樣存放與內核中。當進程對命名管道的使用結束後,命名管道依然存在於文件系統中,除非對其進行刪除操作,否則該命名管道不會消失。

命名管道和管道一樣,只能用於單向數據傳輸,如果要用命名管道實現兩個進程間數據的相互交換,需要使用兩條命名管道。

消息隊列

消息隊列是一系列連續排列的消息,保存在內核中,通過消息隊列的引用標識符來訪問。消息隊列與管道很相似,但是用消息隊列的好處是對每個消息指定了特定的消息類型,接收消息的進程可以請求接收下一條消息,也可以請求接收下一條特定類型的消息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章