程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> 一起talk C栗子吧(第八十七回:C語言實例

一起talk C栗子吧(第八十七回:C語言實例

編輯:關於C

各位看官們,大家好,上一回中咱們說的是進程間通信的例子,這一回咱們說的例子是:使用管道進行進程間通信。閒話休提,言歸正轉。讓我們一起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)。

看官們,咱們今天只對管道做一個基本的概述,至於如何使用管道,我們會在後面的章回中詳細介紹。與此同時,我們也會介紹如何使用管道在進程之間通信。

各位看官,關於使用管道進行進程間通信的例子咱們就說到這裡。欲知後面還有什麼例子,且聽下回分解 。


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved