天天看點

Linux 程序間通信-管道

 程序是一個獨立的資源配置設定機關,不同程序之間的資源是互相獨立的,沒有關聯,不能在一個程序中直接通路另一個程序中的資源。但是,程序不是孤立的,不同的程序之間需要資訊的交換以及狀态的傳遞,是以需要程序間資料傳遞、同步與異步的機制。   此篇博文記錄管道。
  管道是程序間通信的主要手段之一。一個管道實際上就是個隻存在于記憶體中的檔案,對這個檔案的操作要通過兩個已經打開檔案進行,它們分别代表管道的兩端。管道是一種特殊的檔案,它不屬于某一種檔案系統,而是一種獨立的檔案系統,有其自己的資料結構。根據管道的适用範圍将其分為:無名管道和命名管道。

●     無名管道

  主要用于父程序與子程序之間,或者兩個兄弟程序之間。在linux系統中可以通過系統調用建立起一個單向的通信管道,且這種關系隻能由父程序來建立。是以,每個管道都是單向的,當需要雙向通信時就需要建立起兩個管道。管道兩端的程序均将該管道看做一個檔案,一個程序負責往管道中寫内容,而另一個從管道中讀取。這種傳輸遵循“先入先出”(FIFO)的規則。

●     命名管道

  命名管道是為了解決無名管道隻能用于近親程序之間通信的缺陷而設計的。命名管道是建立在實際的磁盤媒體或檔案系統(而不是隻存在于記憶體中)上有自己名字的檔案,任何程序可以在任何時間通過檔案名或路徑名與該檔案建立聯系。為了實作命名管道,引入了一種新的檔案類型——FIFO檔案(遵循先進先出的原則)。實作一個命名管道實際上就是實作一個FIFO檔案。命名管道一旦建立,之後它的讀、寫以及關閉操作都與普通管道完全相同。雖然FIFO檔案的inode節點在磁盤上,但是僅是一個節點而已,檔案的資料還是存在于記憶體緩沖頁面中,和普通管道相同。

  寫入管道的資料按到達次序排列。如果管道滿,則對管道的寫被阻塞,直到管道的資料被讀操作讀取。對于寫操作,如果一次write調用寫的資料量小于管道容量,則寫必須一次完成,即如果管道所剩餘的容量不夠,write被阻塞直到管道的剩餘容量可以一次寫完為止。如果write調用寫的資料量大于管道容量,則寫操作分多次完成。如果用fcntl設定管道寫端口為非阻塞方式,則管道滿不會阻塞寫,而隻是對寫傳回0。

  讀操作按資料到達的順序讀取資料。已經被讀取的資料在管道内不再存在,這意味着資料在管道中不能重複利用。如果管道為空,且管道的寫端口是打開狀态,則讀操作被阻塞直到有資料寫入為止。一次read調用,如果管道中的資料量不夠read指定的數量,則按實際的數量讀取,并對read傳回實際數量值。如果讀端口使用fcntl設定了非阻塞方式,則當管道為空時,read調用傳回0。

  如果管道的讀端口關閉,那麼在該管道上的發出寫操作調用的程序将接收到一個SIGPIPE信号。關閉寫端口是給讀端口一個檔案結束符的唯一方法。對于寫端口關閉後,在該管道上的read調用将傳回0。

  用于父程序與子程序之間,或者兩個兄弟程序之間。

Linux 程式間通信-管道
Linux 程式間通信-管道
Linux 程式間通信-管道
Linux 程式間通信-管道

  能用于近親程序之間通信。

Linux 程式間通信-管道
Linux 程式間通信-管道
Linux 程式間通信-管道
Linux 程式間通信-管道
Linux 程式間通信-管道
Linux 程式間通信-管道

本文轉自cococo點點部落格園部落格,原文連結:http://www.cnblogs.com/coder2012/p/3441039.html,如需轉載請自行聯系原作者

繼續閱讀