Linux使用pipe管道實現父子進程之間通訊


一、概述

  管道的基本概念理解:

    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; }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM