程序間通訊 管道通訊(pipe與fifo)

2021-09-22 09:57:53 字數 2388 閱讀 3694

1.程序間通訊 ipc--interprocess communication

程序間通訊常用的4中方式:

2.pipe管道

pipe管道為匿名管道,就是乙個偽檔案,是乙個核心緩衝區,不占用磁碟空間。管道由讀端與寫端組成,分別對應兩個檔案描述符,管道的讀寫預設是阻塞的。管道的內部是由環形佇列構成的,具有先進先出的特點,預設緩衝區大小為4k,資料只能讀取一次,不能重複讀取,且適應與有血緣關係的程序,比如父子程序,或者兄弟程序。

pipe管道的建立:

int pipe(int fd[2])

上面的fd為傳出引數,返回了讀端與寫端的兩個檔案描述符,fd[0]對應讀端,fd[1]對應寫端。

3.利用pipe管道程序通訊

在講解管道通訊之前,先給出乙個利用檔案進行通訊的示例:

fork()了乙個子程序以後,子程序與父程序的檔案描述符一致,比如在父程序中open了乙個檔案temp,檔案描述符為3,則子程序中3檔案描述符指向的也是temp,這樣就可以通過讀、寫temp檔案,實現父子程序之間的通訊。

由於對檔案的讀寫預設是非阻塞的,因此在子程序中先要sleep(1),保證父程序先寫完然後再讀。

利用管道實現父子間通訊,實現ps aux |grep bash

其實和上面利用檔案是一樣的,只不過上面操作的是磁碟上的檔案,這裡操作的是虛擬檔案。管道預設是非阻塞的,因此在子程序中不需要跟上面操作檔案一樣加上sleep了。

利用兄弟程序實現ps aux | grep bash

4.fifio管道

fifo為有名管道 ,在磁碟上有檔案,.p檔案,但磁碟上的檔案大小始終為零,它在核心緩衝區內有乙個對應的緩衝區,資料是儲存在緩衝區中而不是磁碟中,所以其實fifo也是乙個偽檔案,但在磁碟上有檔名。所以能夠實現沒有血緣關係的程序間通訊。

下面給出乙個簡單的示例說明利用fifo實現程序間通訊,兩個程序分別為fifo_write.c與fifo_read.c

fifio_write.c

#include#include#include#include#include#include#includeint main(int argc,const char* ar**)

//判斷檔案是否存在

int ret =access(ar**[1],f_ok);

if(ret==-1)

printf("建立有名管道%s成功\n",ar**[1]);

}int fd=open(ar**[1],o_wronly);

if(fd==-1)

char *p="hello,world";

while(1)

close(fd);

return 0;

}

fifo_read.c

#include#include#include#include#include#include#includeint main(int argc,const char* ar**)

//判斷檔案是否存在

int ret =access(ar**[1],f_ok);

if(ret==-1)

printf("建立有名管道%s成功\n",ar**[1]);

}int fd=open(ar**[1],o_rdonly);

if(fd==-1)

char buf[512];

while(1)

close(fd);

return 0;

}

Linux程序間通訊 管道 pipe

程序是乙個獨立的資源管理單元,不同程序間的資源是獨立的,不能在乙個程序中訪問另乙個程序的使用者空間和記憶體空間。但是,程序不是孤立的,不同程序之間需要資訊的互動和狀態的傳遞,因此需要程序間資料的傳遞 同步和非同步的機制。當然,這些機制不能由哪乙個程序進行直接管理,只能由作業系統來完成其管理和維護,l...

程序間通訊 管道

include int pipe int fd 2 返回值 若成功,返回0,若出錯,返回 1經由引數fd返回兩個檔案描述符 fd 0 為讀而開啟,fd 1 為寫而開啟。fd 1 的輸出是fd 0 的輸入。else if pid 0 子程序 else else if pid 0 父程序 printf ...

程序間通訊 管道

原文 程序間通訊 管道 管道簡介 常說的管道都是匿名半雙工管道,匿名半雙工管道在系統中是沒有實名的,並不可以在檔案系統中以任何方式看到該管道。它只是程序的一種資源,會隨著程序的結束而被系統清除。管道通訊是在unix系統中應用比較頻繁的一種方式,例如使用grep查詢 ls grep ipc 顧名思義,...