1. 程式人生 > >Linux之管道

Linux之管道

管道的概念

管道是Unix中最古老的程序間通訊的形式。 我們把從一個程序連線到另一個程序的一個數據流稱為一個“管道” 我們通常把是把一個程序的輸出連線或“管接”(經過管道來連線)到另一個程序的輸入。

管道特點

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

pipe函式

包含標頭檔案<unistd.h> 功能:建立一無名管道 原型

int pipe(int file_descriptor[2]);

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

示例程式碼:

#include<stdio.h> #include<unistd.h> #include<stdlib.h> #include<signal.h> #include<string.h>

int main(int argc,char *argv[]) {     int fd[2];     printf("f[0]=%d,f[1]=%d\n",fd[0],fd[1]);     pipe(fd);     printf("f[0]=%d,f[1]=%d\n",fd[0],fd[1]);

    char buf[1024]={0};     int fid = fork();     if(fid > 0)     {         read(fd[0],buf,1024);         printf("read data %s\n",buf);     }     else if(fid == 0)     {                  write(fd[1],"helloworld",strlen("helloworld"));

    }     else     {         perror("fork error");     }     return 0; }

列印結果

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

複製檔案描述符dup

#include<stdio.h> #include<stdlib.h> #include<string.h> #include<signal.h>

int main() {     int fd = dup(1);

    printf("file fd= %d\n",fd);     write(fd,"helloworld",strlen("helloworld"));     return 0; }

列印結果:

1為輸入到終端