一、概述
管道的基本概念理解:
1.管道本質上是一塊內核緩沖區(一端將數據寫入內核,另一端從內核中讀取數據),內部的實現是環形隊列
2.管道有讀寫兩端,讀寫兩端是兩個文件描述符
3.數據的流向是從管道的寫端流到管道的讀端(數據的流向是單向的)
4.數據被讀走了之后,在管道中就消失了
5.pipe只能用於有血緣關系的進程間通訊
6.管道的讀寫兩端是阻塞的。
7.管道的大小默認是4k,但是會根據實際的情況做適當的調整。
二、實例代碼
//pipe用於父子進程間通訊。1.父進程創建愛你pipe,父進程調用fork函數創建子進程 //父進程關閉一端 //子進程關閉一端 //父進程和子進程分別執行read或者write操作 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <unistd.h> #include <sys/wait.h> int main(){ //創建管道,fd[0]讀取,fd[1]寫入 int fd[2]; int ret = pipe(fd); if(ret<0){ perror("pipe error"); return -1; } //創建子進程 pid_t pid= fork(); if(pid<0){//說明創建子進程失敗 perror("create fork fail"); return -1; }else if(pid>0){//說明是父進程 //關閉讀端 close(fd[0]);
//暫停5秒,此處的意義是讓驗證讀取 sleep(5);
//向管道中寫入數據,第一個參數是文件描述符id,第二個參數是寫入內容,第三個參數是寫入長度 write(fd[1],"hello world",strlen("hello world"));
//等在子進程結束,不然會出現僵屍進程 wait(NULL); }else{//說明是子進程,此處也等價於pid==0, //關閉寫端 close(fd[1]); //用於接收數據 char buf[64];
//用於給buf初始化值 memset(buf,0x00,sizeof(buf));
//從管道中讀取數據 int n = read(fd[0],buf,sizeof(buf)); printf("read over,n==[%d],buf==[%s]\n",n,buf); } return 0; }