pipe用於在具有血緣關系的進程之間的通信。
pipe單獨構成一種獨立的文件系統,對於管道兩端的進程而言,它就是一個文件,但它不是普通的文件;
管道不屬於現有的某個文件系統,它單獨構成一種文件系統,存在於內存中;
除了對具有血緣關系的進程外,管道對於其它的進程是不可見的。
使用pipe系統調用可以用來創建一個管道,
#include <unistd.h>
int pipe(int pipefd[2]);
其中pipefd[0]是讀數據端,pipefd[1]是寫數據端。
所謂半雙工,就是在一段時間內,數據只能從一端到另一端傳輸;
所謂全雙工,就是同一個時間既允許讀、也允許寫。
所以,pipe和FIFO都是屬於半雙工通信。
如果需要從pipe讀數據,需要先將寫數據描述符關掉;
如果要向pipe寫數據,需要先將讀數據描述符關掉。
ls | more,它是將ls的標准輸出透過管道作為more程序的標准輸入。
它和使用臨時文件的方法:ls > temp; more < temp;
類似,但是相比於臨時文件的方法,使用管道具有更高的程序效率。
ls | more的執行過程:
1. 調用pipe系統調用創建管道;
2. 調用fork系統創建兩個進程用來裝載管道兩邊的程序;
#include <unistd.h>
pid_t fork(void);
3. close管道左邊的讀數據描述符和管道右邊的寫數據描述符;
#include <unistd.h>
int close(int fd);
4. 其中一個進程執行ls程序,它會先
dup2(writefd, stdout);
將標准輸出stdout重定向到writefd。
這樣執行ls程序的標准輸出結果就會被重定向到writefd;
5. 另外一個進程用來執行more程序,它會先
dup2(readfd, stdin);
將標准輸出重定向到readfd。
這樣execve()執行/bin/more時就會默認從stdin讀數據。
#include <unistd.h>
int dup2(int oldfd, int newfd);
dup2系統調用在重定向進程的stdin、stdout和stderr時非常有用。