Linux關於管道

2021-08-28 02:59:17 字數 2429 閱讀 2036

管道是unix中最古老的程序間通訊的形式。 我們把從乙個程序連線到另乙個程序的乙個資料流稱為乙個「管道」 我們通常把是把乙個程序的輸出連線或「管接」(經過管道來連線)到另乙個程序的輸入。

管道是半雙工的,資料只能向乙個方向流動;需要雙方通訊時,需要建立起兩個管道 只能用於父子程序或者兄弟程序之間(具有親緣關係的程序)進行通訊;通常,乙個管道由乙個程序建立,然後該程序呼叫fork,此後父、子程序之間就可應用該管道。

包含標頭檔案功能:建立一無名管道 原型

int pipe(int file_descriptor[2]);

引數 file_descriptor:檔案描述符陣列,其中file_descriptor[0]表示讀端,file_descriptor[1]表示寫端 返回值:成功返回0,失敗返回錯誤**

示例**:

#include#include#include#include#includeint main(int argc,char *argv)

;    int fid = fork();

if(fid > 0)

else if(fid == 0)

else

return 0;

}

列印結果

管道讀寫規則:如果試圖從管道寫端讀取資料,或者向管道讀端寫入資料都將導致錯誤發生 當沒有資料可讀時,read呼叫就會阻塞,即程序暫停執行,一直等到有資料來到為止。 如果管道的另一端已經被關閉,也就是沒有程序開啟這個管道並向它寫資料時,read呼叫就會阻塞

#include#include#include#includeint main()

列印結果:

1為輸入到終端

原理通過把發的fd[1]寫複製到shell的1(標準輸入),fd[0]複製到shell的2(標準輸出)

以下是**:

#include#include#include#include#include#includeint main()

;    pipe(fd);

int pid = fork();

if(pid > 0)

else if(pid == 0)

else

return 0;

}

實現結果:

作用:允許乙個程式把另外乙個程式當作乙個新的程序來啟         動,並能對它傳送資料或接收資料

file* popen(const char *command,                const char *open_mode);

command:待執行程式的名字和相應的引數 open_mode:必須是「r」或「w」 如果操作失敗,popen會返回乙個空指標

以下**:

#include#include#include#include#include#includeint main()

;    fread(buf,1,1024,file);

fclose(file);

file *wcfile = popen("wc","w");

fwrite(buf,1,strlen(buf),wcfile);

fclose(wcfile);

return 0;

}

**結果:

我們首先要知道命名管道,要讀段和寫段同時開啟,才能向檔案讀寫資料。

貼上**來理解命名管道的規則

首先是讀端:

#include#include#include#include#include#includeint main(int argc,char *argv)

接下來是寫端:

#include#include#include#include#include#includevoid handle(int signo)

int main(int argc,char *argv)

}

執行寫端:

它在等待另一端的開啟,才能向裡面寫入資料

此時我們開啟讀端:

馬上可以看到寫段可以寫資料

而執行5秒後,我們可以看到寫的時候返回-1,並且獲取到管道破裂的資訊(sigpipe)

所以這裡就是我們所注意的點,當我們寫客戶端和伺服器進行管道傳輸的時候,如果客戶端一旦退出來,就會使管道破裂,所以我們必須通過捕捉訊號,來避免這種事情發生。

關於管道的理解 Linux篇

首先,對於程序之間的通訊,一共有三種方式 管道 pipe fifo mmp對映 管道是一種兩個程序間進行單向通訊的機制。因為管道傳遞資料的單向性,管道又稱為半雙工管道。管道的這一特點決定了器使用的侷限性。管道是linux支援的最初unix ipc形式之一,具有以下特點 資料只能由乙個程序流向另乙個程...

linux管道(無名管道)

首先管道是程序之間的乙個單向資料流,它的資料流向由核心管理,只能從乙個程序流向另外乙個程序,乙個程序向管道寫入資料,另外乙個程序從這個管道讀取資料。在使用管道 無名管道 時,只能用在父子程序或者親屬程序之間,若要用在任意程序之間則需要使用fifo 有名管道 如圖程序ab通過管道進行資料交換。程序a通...

Linux管道(無名管道)

是一套免費使用和自由傳播的類unix作業系統,是乙個基於posix和unix的多使用者 多工 支援多執行緒和多cpu的作業系統。它能執行主要的unix工具軟體 應用程式和網路協議。它支援32位和64位硬體。linux繼承了unix以網路為核心的設計思想,是乙個效能穩定的多使用者網路作業系統。它主要用...