程序間通訊 管道

2021-08-02 14:54:04 字數 3141 閱讀 7635

1.什麼是管道?

管道是一種最基本的程序通訊機制,其實質是由核心管理的乙個緩衝區,可以形象地認為管道的兩端連線著兩個需要進行通訊的程序,其中乙個程序進行資訊輸出,將資料寫入管道; 另乙個程序進行資訊輸入,從管道中讀取資訊。可以用下圖表示

2.管道的分類

(1)匿名管道,我們平時進行操作時,曾經接觸過「ls | wc -l」之類的組合。這種命名由管道符號「|」連線的兩個或者多個命令組成。這裡使用的管道就是匿名管道。

在程式中使用匿名管道時,需要先建立乙個管道, linux 系統中建立匿名管

道的函式為 pipe()。

int

pipe(int pipefd[2]);

其引數實質是乙個檔案描述符匿名管道只能在有親緣關係的程序間使用。匿名管道的通訊過程:匿名管道利用 fork 機制

建立,剛建立出的管道,讀寫兩端都連線在同乙個程序上,當程序中呼叫 fork()

建立子程序後,父子程序共享檔案描述符,因此子程序擁有與父程序相同的管道。pipe()建立管道後讀端對應的檔案描述符為 fd[0], 寫端對應的檔案描述符為fd[1].

fork()後的父子程序中檔案描述符與管道的關係如下圖

管道通過pipe()建立時自動開啟,關閉應由使用者實現。我們要進行父子之間通訊。首先關閉父程序的讀端(即close(fd[0])),關閉子程序的寫端(close(fd[1]))。這樣就可以父子通訊,當程式結束時,匿名管道自動刪除

父子通訊的檔案描述符與管道間的關係如下圖

有親緣關係的程序,除父子外,還有兄弟程序等具備其它聯絡的程序。實現這些程序間通訊的實質,是關閉多個程序中多餘的檔案描述符,只為

待通訊程序保留讀端寫端。

(2)命名管道端,匿名管道沒有名字,只能用於有親緣關係的程序間通訊,為了打破這一侷限,linux 中設計了命名管道命名管道又名 fifo*(first in first out),它與匿名管道

的不同之處在於: 命名管道與系統中的乙個路徑名關聯,以檔案的形式存在於檔案系統中, 如此,系統中的不同程序可以通過 fifo 的路徑名訪問 fifo 檔案,實現彼此間的通訊。通訊結束後,命名管道不銷毀。

linux可以通過kfifo -m 許可權 名稱稱 來建立命名管道。也可以通過下面的函式來建立

int mkfifo(const

char* pathname,mode_t mode);

引數pathname,表示管道檔案的路徑,引數mode用於指定fifo的許可權。成功呼叫返回,否則返回-1

3.命名管道和匿名管道的特點

(1)只能進行單向通訊

(2)命名和匿名管道的不同,匿名只能進行由血緣關係程序間的通訊,而命名管道可以進行任何不相干程序間的通訊,當然也可以進行血緣間的通訊。

(3)面向流式服務。

(4)生命週期隨程序。

(5)自帶同步與互斥機制。

4匿名管道進行父子間通訊的**

hljs cpp">#include

#include

#include

#include

#include

int main()

pid_t pid=fork(); //建立子程序

命名管道通訊

fifo_write.c 表示向管道寫資料

#include

#include

#include

#include

#include

#include

#include

int main(int argc,char* argv)

else

}int fd=open("./myfifo",o_wronly); //以讀的方式開啟檔案

while(1) //迴圈寫入資料

close(fd);

return

0;}

fifo_read.c 表示從管道拿資料

#include

#include

#include

#include

#include

#include

#include

int main()

while(1) //迴圈讀入資料

; read(fd,buf,sizeof(buf));

printf("buf=%s\n",

buf);

sleep(2);

} close(fd);

return

0;}

執行結果

接收端結果

程序間通訊 管道

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 顧名思義,...

程序間通訊 管道

程序間通訊,又稱為ipc,包含以下型別 半雙工管道fifo 全雙工管道 訊息佇列 訊號 訊號量共享記憶體 套接字socket streams。一,管道是unix系統ipc的最古老形式,他具有兩種侷限性 1 資料只能在乙個方向上流動 2 只能在具有公共祖先的程序之間使用。乙個管道由乙個程序建立,然後該...