Windows XP Windows 7 Windows 2003 Windows Vista Windows教程綜合 Linux 系統教程
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟件教程
 Windows教程網 >> Linux系統教程 >> Linux系統常見問題解答 >> Linux環境進程間通信:管道及有名管道

Linux環境進程間通信:管道及有名管道

日期:2017/1/20 17:36:01      編輯:Linux系統常見問題解答

 管道及有名管道

  在本系列序中作者概述了 linux 進程間通信的幾種主要手段。其中管道和有名管道是最早的進程間通信機制之一,管道可用於具有親緣關系進程間的通信,有名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關系進程間的通信。 認清管道和有名管道的讀寫規則是在程序中應用它們的關鍵,本文在詳細討論了管道和有名管道的通信機制的基礎上,用實例對其讀寫規則進行了程序驗證,這樣做有利於增強讀者對讀寫規則的感性認識,同時也提供了應用范例。

  1、 管道概述及相關API應用

  1.1 管道相關的關鍵概念

  管道是Linux支持的最初Unix IPC形式之一,具有以下特點:

  管道是半雙工的,數據只能向一個方向流動;需要雙方通信時,需要建立起兩個管道;

  只能用於父子進程或者兄弟進程之間(具有親緣關系的進程);

  單獨構成一種獨立的文件系統:管道對於管道兩端的進程而言,就是一個文件,但它不是普通的文件,它不屬於某種文件系統,而是自立門戶,單獨構成一種文件系統,並且只存在與內存中。

  數據的讀出和寫入:一個進程向管道中寫的內容被管道另一端的進程讀出。寫入的內容每次都添加在管道緩沖區的末尾,並且每次都是從緩沖區的頭部讀出數據。

  1.2管道的創建:

  #include int pipe(int fd[2])

  該函數創建的管道的兩端處於一個進程中間,在實際應用中沒有太大意義,因此,一個進程在由pipe()創建管道後,一般再fork一個子進程,然後通過管道實現父子進程間的通信(因此也不難推出,只要兩個進程中存在親緣關系,這裡的親緣關系指的是具有共同的祖先,都可以采用管道方式來進行通信)。

  1.3管道的讀寫規則:

  管道兩端可分別用描述字fd[0]以及fd[1]來描述,需要注意的是,管道的兩端是固定了任務的。即一端只能用於讀,由描述字fd[0]表示,稱其為管道讀端;另一端則只能用於寫,由描述字fd[1]來表示,稱其為管道寫端。如果試圖從管道寫端讀取數據,或者向管道讀端寫入數據都將導致錯誤發生。一般文件的I/O函數都可以用於管道,如close、read、write等等。

  從管道中讀取數據:

  如果管道的寫端不存在,則認為已經讀到了數據的末尾,讀函數返回的讀出字節數為0;

  當管道的寫端存在時,如果請求的字節數目大於PIPE_BUF,則返回管道中現有的數據字節數,如果請求的字節數目不大於PIPE_BUF,則返回管道中現有數據字節數(此時,管道中數據量小於請求的數據量);或者返回請求的字節數(此時,管道中數據量不小於請求的數據量)。注:(PIPE_BUF在include/linux/limits.h中定義,不同的內核版本可能會有所不同。Posix.1要求PIPE_BUF至少為512字節,red hat 7.2中為4096)。

  關於管道的讀規則驗證:

  /************** * readtest.c * **************/#include #include

  向管道中寫入數據:

  向管道中寫入數據時,linux將不保證寫入的原子性,管道緩沖區一有空閒區域,寫進程就會試圖向管道寫入數據。如果讀進程不讀走管道緩沖區中的數據,那麼寫操作將一直阻塞。

  注:只有在管道的讀端存在時,向管道中寫入數據才有意義。否則,向管道中寫入數據的進程將收到內核傳來的SIFPIPE信號,應用程序可以處理該信號,也可以忽略(默認動作則是應用程序終止)。

  對管道的寫規則的驗證1:寫端對讀端存在的依賴性

Copyright © Windows教程網 All Rights Reserved