程序間的通訊IPC 匿名管道pipe

2021-10-23 07:49:51 字數 2291 閱讀 1528

管道:

實現原理: 核心借助環形佇列機制,使用核心緩衝區實現。

特質:

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.由...