標籤:hid 檢索 for write 發送 pre article 終端 mod
各位看官們,大家好。上一回中咱們說的是處理序間通訊的範例。這一回咱們說的範例是:使用管道進行處理序間通訊。
閑話休提,言歸正轉。
讓我們一起talk C栗子吧!
我們在前面的的章回中介紹了使用管道進行進程問的通訊,時間不長,相信大家還記得。今天。我們介紹第二種處理序間通訊的方式:管道。大家都知道,我們使用訊號在處理序間通訊時,本質上發送的是一個數值,假設想在進程之間發送一些資料時訊號就無能為力了。此時,管道就派上了用場。
我們能夠通過管道在進程之間發送資料。
接下來我們就具體介紹一下管道。
管道相似我們生活中的自來水管,它能夠把自來水引入到家中。在Linux命令中也有管道的身影。通常使用”|”來表示管道。我們舉一個Linux命令中使用管道的範例:
env | grep bash //在終端中輸入下面命令而且 執行SHELL=/bin/bash //命令執行的結果
我們在上面 的範例中首先使用env輸出環境變數,然後通過管道把env命令輸出的內容當作grep命令的輸入內容。grep命令在輸入內容中檢索到了bash,並顯示檢索的結果。也就是我們看到的命令執行結果。
我們在進程中使用的管道和上面範例中使用的管道是相似的:在一個進程內輸入資料,在另外一個進程內輸出資料。
兩個進程通過管道來發送資料。
我們會介紹三種管道及其用法:
- 第一種管道我稱之為偽管道。
- 第二種管道我稱之為入門級管道。
- 第三種管道是真正意義上的管道。
偽管道使用popen/pclose開啟一個檔案流,然後使用I/O函數對流進行操作。
由於popen的參數是某個Linux命令。而且它是通過啟動shell來執行Linux命令。所以效能較低。它的效果和終端中管道命令“|”的效果同樣。這也是我稱其為偽管道的原因。
入門級管道通過pipe建立一個管道,而且返回兩個檔案描寫敘述符。然後使用read/write系統調用對返回的fd進行操作,進而實現進程通訊功能。該方法須要配合fork函數一起使用。由於兩個fd在同一個數組中,大部分數組是局部變數。局部變數僅僅能在fork建立的父子進程中使用。
當然了,假設把fd數組定義成全域變數也能夠。只是全域變數的風險就太大了。
真正意義上的管道須要使用mkfifo建立一個管道檔案,它會返回一個fd。接下來,能夠使用open/read等系統叫用作業fd。我們能夠像正常操作檔案一樣操作該管道檔案。該管道還有另外一個名字:具名管道(FIFO)。
看官們,咱們今天僅僅對管道做一個主要的概述。至於怎樣使用管道,我們會在後面的章回中具體介紹。
與此同一時候,我們也會介紹怎樣使用管道在進程之間通訊。
各位看官,關於使用管道進行處理序間通訊的範例咱們就講到這裡。欲知後面還有什麼範例,且聽下回分解 。
一起talk C栗子吧(第八十七回:C語言執行個體--使用管道進行處理序間通訊概述)