天天看點

程序間通信 管道 (pipe,FiFO)

管道的運作原理

管道是一種最基本的IPC機制,由pipe函數建立

<code>#include &lt;unistd.h&gt;</code>

<code>int</code> <code>pipe(</code><code>int</code> <code>_pipe[2]);</code>

      調用pipe函數時在核心中開辟一塊緩沖區用于通信,它有一個讀端和一個寫端,通過filedes參數傳出給程式兩個檔案描述符,filedes[0]指向管道的讀端,filedes[1]指向管道的寫端。管道就像一個打開的檔案,通過read(filedes[0]);或者write(filedes[1]);向這個檔案讀寫資料,其實是在讀寫核心緩沖區。pipe函數調用成功傳回0,調用失敗則傳回-1。

通信的步驟如下:

父程序建立管道

父程序調用pipe開辟管道,得到的兩個檔案描述符指向管道的兩端。

父程序fork出子程序

父程序調用fork建立子程序,則子程序也有兩個檔案描述符指向同一管道。

父程序關閉fd[0],子程序關閉fd[1];

 父程序關閉管道讀端,子程序關閉管道寫端。父程序可以往管道裡寫,子程序可以從管道裡讀,管道是用環形隊列實作的,資料從寫端流入從讀端流出,實作了程序間通信。

管道使用存在一些特殊情況:

       (1)所有指向管道寫端的檔案描述符都關閉了(管道寫端的引用計數等于0),而仍然有程序從管道的讀端讀資料時,那麼管道中剩餘的資料都被讀取後,再次read會傳回0,就像讀到檔案末尾一樣。

        (2)指向管道寫端的檔案描述符沒關閉(管道寫端的引用計數大于0),而持有管道寫端的程序也沒有向管道中寫資料,這時有程序從管道讀端讀資料時,管道中剩餘的資料都被讀取後,再次read會阻塞,直到管道中有資料可讀了才讀取資料并傳回。

        (3)所有指向管道讀端的檔案描述符都關閉了(管道讀端的引用計數等于0),這時有程序向管道的寫端write,那麼該程序會收到信号SIGPIPE,通常會導緻程序異常終止。

        (4)指向管道讀端的檔案描述符沒關閉(管道的引用計數大于0),而持有管道讀端的程序也沒有從管道中讀資料,這時有程序向管道寫端寫資料,那麼在管道被寫滿時再次write會阻塞,直到管道中有空位置了才寫入資料并傳回。

管道的特點:

隻允許單項資料通信(常用于父子程序間通信)

管道依賴于檔案系統

隻允許具有血緣關系程序之間的通信

面向位元組流的資料傳輸服務;

管道的生命周期: 跟随程序

命名管道(FIFO)

本文轉自 七十七快 51CTO部落格,原文連結:http://blog.51cto.com/10324228/1827533

繼續閱讀