1. 程式人生 > >Linux系統程式設計—管道

Linux系統程式設計—管道

**▋****1. 管道的概念** 管道,又名「無名管理」,或「匿名管道」,管道是一種非常基本,也是使用非常頻繁的IPC方式。 **1.1 管道本質** - 管道的本質也是一種檔案,不過是偽檔案,實際上是一塊核心緩衝區,大小4K; - 管道建立以後會產生兩個檔案描述符,一個是讀端,另一個是寫端; - 管道里的資料只能從寫端被寫入,從讀端被讀出; **1.2 管道原理** 管道是核心的一塊緩衝區,更具體一些,是一個環形佇列。資料從佇列的一端寫入資料,另一端讀出,如下圖示: ![img](https://img2020.cnblogs.com/other/1218435/202010/1218435-20201010191659414-567068199.webp) **1.3 管道的優點** 簡單 **1.4 管道的缺點** - 只能單向通訊,如果需要雙向通訊則需要建立兩個管道; - 只能應用於具有血緣關係的程序,如父子程序; - 緩衝區大小受限,通常為1頁,即4k; **▋****2. 管道的建立** 管道建立三步曲: a. 父程序呼叫pipe函式建立管道; b. 父程序呼叫fork函式建立子程序; c. 父程序關閉fd[0],子程序關閉fd[1]; 具體如下圖所示: ![img](https://img2020.cnblogs.com/other/1218435/202010/1218435-20201010191659702-1393417558.webp) **▋****3. 管道的讀寫行為** a. 管道的緩衝區大小固定為4k,所以如果管道內資料已經寫滿,則無法再寫入資料,程序的write呼叫將阻塞,直到有足夠的空間再寫入資料; b. 管道的讀動作比寫動作要快,資料一旦被讀走了,管道將釋放相應的空間,以便後續資料的寫入。當所有的資料都讀完之後,程序的read()呼叫將阻塞,直到有資料再次寫入。 **▋****4. 例程** **父子間通訊:** ``` 1#