Liunx程序間通訊之管道

2021-10-04 03:12:01 字數 2146 閱讀 9833

目錄

管道(pipe)

管道的侷限性:

管道的建立:  

fork使用管道使父子程序進行通訊

程式設計實現

執行結果

執行結果分析

管道是unix系統ipc的最古老的形式,所有的unix系統都提供此種通訊機制。管道的實質是乙個核心緩衝區,程序以先進 先出(fifo, first in first out)的方式從緩衝區訪問資料:管道一端的程序順序地將程序資料寫入緩衝區,另一端的程序則順 序地讀取資料,該緩衝區可以看做乙個迴圈佇列,讀和寫的位置都是自動增加的,乙個資料只能被讀一次,讀出以後再緩衝區都 不復存在了。當緩衝區讀空或者寫滿時,有一定的規則控制相應的讀程序或寫程序是否進入等待佇列,當空的緩衝區有新資料寫 入或慢的緩衝區有資料讀出時,就喚醒等待佇列中的程序繼續讀寫。

半雙工,資料只能在乙個方向流動,現在有些系統可以支援全雙工管道,但是為了最佳的可移植性,應認為系統 不支援全雙工管道; (

管道只能在具有公共祖先之間的兩個程序之間使用;

管道可以看成是一種特殊的檔案,對於它的讀寫也可以使用普通的read、write 等函式。但是它不是普通的檔案,並不 屬於其他任何檔案系統,並且只存在於記憶體中。管道是通過呼叫pipe函式建立的。

#include #include int pipe2(int pipefd[2], int flags);
經由引數fd返回的兩個檔案描述符:fd[0]為讀而開啟,fd[1]為寫而開啟,fd[1]的輸出是fd[0]的輸入。

通常,程序會先呼叫pipe,接著呼叫fork,從而建立了父程序與子程序的ipc通道。

fork之後做什麼取決於我們想要的資料流的方向,例如:對於從父程序到子程序,父程序關閉管道的讀端fd[0],子程序關閉寫端 fd[1]。

父程序關閉讀端,子程序關閉寫端,這樣就實現了父子程序間的通訊。子程序從管道的fd[0]寫入資料,父程序從管道的fd[1]讀資料。

#include #include #include #include #define  buf_size   1024

#define w_str "hello child, i'am praent."

int main(int argc, char *ar**)

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

if (pid <0)

else if (pid > 0) //父程序

printf("the parent write %d bytes form pipe_fd[%d] to pipe_fd[%d].\n",rv, pipe_fd[1], pipe_fd[0]);

wait(wait_status); //等待子程序結束

puts("the parent wait child exit and will exit.");

}else if (0 == pid) //子程序

父程序建立管道之後fork(),這時子程序會繼承父程序所有開啟的 檔案描述符(包括管道),這時對於乙個管道就有4個讀寫端(父子程序各有一對管道讀寫端),如果需要父程序往子程序裡寫 資料,則需要在父程序中關閉讀端,在子程序中關閉寫端;而如果需要子程序往父程序中寫資料,則可以在父程序關閉寫端,然 後子程序中關閉讀端。

這樣就使得父程序寫資料,子程序讀資料,實現父子程序間的通訊。

程序間通訊 之 管道

一 無名管道 特點 具有親緣關係的程序間通訊,但不僅僅指父子程序之間哦。1 無名管道的建立 int pipe int pipefd 引數 pipefd 陣列的首位址 返回值 成功返回0,失敗返回 1 注意 無名管道存在核心空間,建立成功會給使用者空間兩個檔案描述符,fd 0 讀管道 fd 1 寫管道...

程序間通訊之管道

我們將乙個程序到另乙個程序的資料流稱為管道,它是程序間通訊最古老的方式。管道分為兩種 匿名管道與命名管道。匿名管道 顧名思義,所謂的匿名管道自然就是沒有名字的管道,這種管道通常用於有親緣關係的程序間的通訊。匿名管道通常由pipe函式來建立,當乙個程序建立了乙個匿名管道後,它們的模型就是這樣的 可以看...

程序間通訊之管道

既然要介紹程序間通訊,首先來看看什麼是程序間通訊 2.程序間通訊的目的 1 資料傳輸 乙個程序需要將它的資料傳送給另乙個人程序 2 資源共享 多個程序共享同樣的資源 3 通知事件 乙個程序需要向另乙個或一組程序傳送訊息,通知它 它們 發生了某種事件 4 程序控制 有些程序希望完全控制某些程序的執行,...