管道:
實現原理: 核心借助環形佇列機制,使用核心緩衝區實現。
特質:
1. 偽檔案(不占用磁碟空間)
2. 管道中的資料只能一次讀取。
3. 資料在管道中,只能單向流動。
侷限性:
1. 自己寫,不能自己讀。(不能同時進行讀寫操作)
2. 資料不可以反覆讀。
3. 雙向半雙工通訊。(可以讀也可以寫,但同一程序只能是其中的一種)
4. 血緣關係程序間可用。
pipe函式:
int pipe(int fd[2]);
函式功能:建立,並開啟管道。
傳出引數: fd[0]: 讀端檔案描述符。 fd[1]: 寫端檔案描述符。
返回值: 成功: 0; 失敗: -1 errno
管道的讀寫行為:
讀管道:
管道有資料,read返回實際讀到的位元組數。
管道無資料: 1)無寫端,read返回0 (類似讀到檔案尾)
2)有寫端,read阻塞等待。
寫管道:
無讀端, 異常終止。 (sigpipe導致的)
有讀端: 1) 管道已滿, 阻塞等待(一般不會出現這種情況,當管道的buf滿了時,核心會自動擴容)
2) 管道未滿, 返回寫出的位元組個數。
ps:pipe(int fd[2])函式的傳出引數是2個int型的檔案描述符,故對管道進行讀寫操作的函式是:
寫操作:
int write(fd[1],str, strlen(str)); //將str的資料寫入管道
讀操作:
int read(fd[0]),buf, sizeof(buf);//將管道的資料讀取到buf中
關閉:
close
(fd[0]
);//關閉讀端
close
(fd[1]
);//關閉寫端
父子程序共享檔案描述符,在使用管道時,父程序如果想**在進行read()的子程序時,父程序需要先**close(fd[1]);(關閉寫端)**否則子程序會一直阻塞等待其他程序寫入資料,進行管道讀操作,所以子程序不會結束,所以父程序wait(null)時,也無法對子程序進行**,會一直阻塞。(原因:讀操作時,如果管道沒有資料,則檢視是否有寫端存在,如果有,則阻塞等待寫入;如果無,則返回0)
linux命令建立管道檔案:mkfifo 檔名
(fifo對應的是first in first out)
建立出來的管道檔案大小為0;
管道檔案對應的屬性是p。(-:普通檔案;d:目錄檔案;l:符號連線檔案)
附一段實現**:功能實現ls |wc -l
#include
#include
#include
#include
#include
//實現ls -rlt|wc -l功能(父程序實現ls -rlt,將資料通過管道傳個子程序,子程序實現wc -l)
intmain()
;char str[
100]=;
char srcvbuf[
1024+1
]=;int i =0;
int j =0;
//建立並開啟管道
iret =
pipe
( fd );if
(-1== iret )
printf
("pipe successed!read:fd[0]=%d,write:fd[1]=%d\n"
, fd[0]
, fd[1]
);//父子程序共享檔案描述符
for( i =
0; i <
2; i++
)else
if( pid ==0)
printf
("fork success;pid=%d\n"
, pid );}
if( i ==2)
printf
("wait pid = %d\n"
, wpid );}
printf
("parent close success\n");
}else
if( i ==0)
else
if( i ==1)
exit(0
);}
Linux程序間通訊(IPC) 匿名管道
對於read讀取緩衝區為空,阻塞和非阻塞的情況 對write寫快取區滿時,阻塞和非阻塞的情況 1.建立管道,函式原型如下 int pipe int filedes 2 說明 返回值為int型別,0表示建立成功,1表示建立失敗。引數為2個檔案描述符,fd 0 表示讀描述符,fd 1 表示寫描述符。2....
程序間通訊 IPC 管道
管道是unix ipc最古老的形式,所有unix系統都提供此通訊機制。管道的兩種限制 1 半雙工,資料單方向流動。2只能用於具有公共祖先的程序之間。需要雙方通訊時,需要建立起兩個管道。例外 流管道沒有限制1,fifo和命名管道沒有限制2。管道是乙個檔案,但它不屬於某種檔案系統,而是 單獨構成一種檔案...
程序間通訊(IPC) 管道
二 fifo 命名管道 參考管道是一種最基本的ipc機制,作用於有血緣關係的程序之間,完成資料傳遞,呼叫pipe系統函式即可建立乙個管理。有如下性質 1.其本質是乙個偽檔案 實為核心緩衝區 所謂的偽檔案是指不佔磁碟空間大小的檔案,linux的檔案除了 l d,其它的s,b,c,p等都是偽檔案。2.由...