Linux系統程式設計—管道
阿新 • • 發佈:2020-10-10
**▋****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#