1、pipe 本質: 匿名管道 內核緩衝區 偽文件(偽文件和操作文件類似) 創建方式: fd[0] 表示讀端 fd[1] 表示寫端 返回值: 成功返回0,失敗返回-1 特點: 有讀端和寫端,對應兩個文件描述符,數據從寫端流入,讀端流出 操作管道的進程掛掉後管道自動釋放 管道預設是阻塞的 管道原理: ...
1、pipe
本質:
- 匿名管道
- 內核緩衝區
- 偽文件(偽文件和操作文件類似)
創建方式:
#include <unistd.h>
int pipe(int fd[2]);
- fd[0] 表示讀端
- fd[1] 表示寫端
返回值:
成功返回0,失敗返回-1
特點:
- 有讀端和寫端,對應兩個文件描述符,數據從寫端流入,讀端流出
- 操作管道的進程掛掉後管道自動釋放
- 管道預設是阻塞的
管道原理:
- 實現方式:環形隊列 (先進先出)
- 緩衝區大小:4k (大小會根據實際情況做適當調整) (ulimit -a)
管道的局限:
- 管道中的數據只能讀取一次,不能重覆讀取
- 半雙工工作模式
使用場景:
- 有血緣關係的進程間通信
註意事項:
- 在一個進程里操作同一個管道時,讀時關閉寫端,寫時關閉讀端(避免自己寫,自己讀數據)
2、fifo
本質:
- 有名管道(在磁碟上有一個管道文件)
- 偽文件(大小永遠為0)
- 在內核有對應的緩衝區
創建方式:
- 直接用命令創建在磁碟上:mkfifo name
- 在程式中創建:
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);
參數說明:
- pathname:文件名
- mode:管道文件的許可權(註:實際許可權是 mode & ~umask)
返回值:
- 成功返回0, 失敗返回-1
使用場景:
- 用於沒有血緣關係的進程間通信
操作方式:
- 用IO函數操作(open/close)、(read/write)
進程間通信:
- a.c (read -> fifo) 如果管道沒有東西,會處於阻塞狀態
- b.c (write -> fifo) 如果管道內有東西沒有讀取完,會處於阻塞狀態