管道是一種兩個進(jìn)程間進(jìn)行單向通信的機制箱舞。因為管道傳遞數(shù)據(jù)的單向性,管道又稱為半雙工管道拳亿。管道的這一特點決定了器使用的局限性晴股。管道是Linux支持的最初Unix IPC形式之一,具有以下特點:
????? 數(shù)據(jù)只能由一個進(jìn)程流向另一個進(jìn)程(其中一個讀管道肺魁,一個寫管道)电湘;如果要進(jìn)行雙工通信,需要建 立兩個管道。
????? 管道只能用于父子進(jìn)程或者兄弟進(jìn)程間通信寂呛。怎诫,也就是說管道只能用于具有親緣關(guān)系的進(jìn)程間通信。
除了以上局限性贷痪,管道還有其他一些不足幻妓,如管道沒有名字(匿名管道),管道的緩沖區(qū)大小是受限制的劫拢。管道所傳輸?shù)氖菬o格式的字節(jié)流肉津。這就需要管道輸入方和輸出方事先約定好數(shù)據(jù)格式。雖然有那么多不足舱沧,但對于一些簡單的進(jìn)程間通信妹沙,管道還是完全可以勝任的。
使用管道進(jìn)行通信時狗唉,兩端的進(jìn)程向管道讀寫數(shù)據(jù)是通過創(chuàng)建管道時初烘,系統(tǒng)設(shè)置的文件描述符進(jìn)行的。從本質(zhì)上說分俯,管道也是一種文件肾筐,但它又和一般的文件有所不同,可以克服使用文件進(jìn)行通信的兩個問題缸剪,這個文件只存在內(nèi)存中吗铐。
通過管道通信的兩個進(jìn)程,一個進(jìn)程向管道寫數(shù)據(jù)杏节,另外一個從中讀數(shù)據(jù)唬渗。寫入的數(shù)據(jù)每次都添加到管道緩沖區(qū)的末尾,讀數(shù)據(jù)的時候都是從緩沖區(qū)的頭部讀出數(shù)據(jù)的奋渔。
#include
int pipe(int pipefd[2]);
(匿名)管道兩端分別用描述符pipefd[0]及pipefd[1]來描述镊逝。需要注意的是,管道兩端的任務(wù)是固定的嫉鲸,一端只能用于讀撑蒜,有描述符pipefd[0]表示,稱其為管道讀端玄渗;另一端只能用于寫座菠,由描述符pipe[1]來表示,稱其為管道寫端藤树。該函數(shù)創(chuàng)建的管道的兩端處于一個進(jìn)程中間浴滴,在實際應(yīng)用中沒有太大意義,因此岁钓,一個進(jìn)程在由pipe()創(chuàng)建管道后升略,一般再fork一個子進(jìn)程微王,然后通過管道實現(xiàn)父子進(jìn)程間的通信。
1. 函數(shù)說明
pipe(建立管道):
1) 頭文件 #include
2) 定義函數(shù): int pipe(int filedes[2]);
3) 函數(shù)說明: pipe()會建立管道品嚣,并將文件描述詞由參數(shù)filedes數(shù)組返回骂远。
filedes[0]為管道里的讀取端
filedes[1]則為管道的寫入端。
4) 返回值:? 若成功則返回零腰根,否則返回-1,錯誤原因存于errno中拓型。
#include <stdio.h>
#include <unistd.h>
int main(void)
{
int filedes[2];
charbuf[80];
pid_t?pid;
pipe(?filedes?);
pid=fork();
if(pid?>?0)
{
printf("This?is?in?the?father?process,here?write?a?string?to?the?pipe.\n");
chars[]?="Hello?world?,?this?is?write?by?pipe.\n";
write(?filedes[1],?s,sizeof(s)?);
close(?filedes[0]?);
close(?filedes[1]?);
}
elseif(pid?==?0)
{
printf("This?is?in?the?child?process,here?read?a?string?from?the?pipe.\n");
read(?filedes[0],?buf,sizeof(buf)?);
printf("%s\n",?buf?);
close(?filedes[0]?);
close(?filedes[1]?);
}
waitpid(?pid,?NULL,?0?);
return0;
}
運行結(jié)果:
[root@localhost src]# gcc pipe.c
[root@localhost src]# ./a.out
This is in the child process,here read a string from the pipe.
This is in the father process,here write a string to the pipe.
Hello world , this is write by pipe.
當(dāng)管道中的數(shù)據(jù)被讀取后额嘿,管道為空。一個隨后的read()調(diào)用將默認(rèn)的被阻塞劣挫,等待某些數(shù)據(jù)寫入册养。