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為輸入到終端