linux 匿名管道实例详解

 更新时间:2017年06月22日 09:27:55   投稿:lqh  
这篇文章主要介绍了linux 匿名管道实例详解的相关资料,需要的朋友可以参考下

linux中进程的一种通信方式——匿名管道

pipe函数建立管道

调用pipe函数时在内核中开辟一块缓冲区(称为管道)用于通信,它有一个读端一个写端,然后通过_pipe参数传出给用户程序两个文件描述符,_pipe[0]指向管道的读端,_pipe[1]指向管道的写端。所以管道在用户程序看起来就像一个打开的文件,通过read(_pipe[0]);或者write(_pipe[1]);向这个文件读写数据其实是在读写内核缓冲区。pipe函数调用成功返回0,调用失败返回-1。

1父进程调用pipe开辟管道,得到两个文件描述符指向管道的两端。

2. 父进程调用fork创建⼦进程,那么子进程也有两个文件描述符指向同一管道。

3. 父进程关闭管道读端,子进程关闭管道写端。父进程可以往管道里写,子进程可以从管道⾥读,管道是用环形队列实现的,数据从写端流入从读端流出,这样就实现了进程间通信

匿名管道间的通信是单向的,并且是、只能是具有血缘关系的进程间通信



#include<stdio.h> 
#include<unistd.h> 
#include<string.h> 
#include<stdlib.h> 
 
int main() 
{ 
  int _pipe[2]; 
  int ret = pipe(_pipe); 
  if (ret < 0) 
  { 
    perror("pipe"); 
    return 1; 
  } 
  pid_t id = fork (); 
  if (id<0) 
  { 
    perror("fork"); 
    return 2; 
  } 
  else if (id == 0) 
  { 
    // child 
    int count =5; 
    close (_pipe[0]); 
    char* msg = "hello bit"; 
    while (count --) 
    { 
      write(_pipe[1],msg,strlen(msg)); 
      sleep(1); 
    } 
    close (_pipe[1]); 
    exit(123); 
  } 
  else  
  { 
    // Father 
    close(_pipe[1]); 
    char buf[128]; 
    while(1) 
    { 
      int count =5; 
      ssize_t s = read ( _pipe[0],buf,sizeof(buf)-1); 
      if (s<0) 
      { 
        perror("read"); 
      } 
      else if(s==0) 
      { 
        printf("write is close\n"); 
        return 2; 
      } 
      else 
      { 
        buf[s] ='\0'; 
        printf ("child >> father: %s\n",buf); 
      } 
      count --; 
      if (count == 0) 
      { 
        close (_pipe[0]); 
        break; 
      } 
    } 
     
    int status = 0; 
    pid_t _wait = waitpid (id, &status,0); 
    if (_wait > 0) 
    { 
      printf("exit code is %d, signal is %d\n", 
          WIFEXITED(status), status & 0xff); 
    } 
 
    } 
     
  return 0; 
} 

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • C语言数字图像处理之直方图均衡化

    C语言数字图像处理之直方图均衡化

    这篇文章主要为大家详细介绍了C语言数字图像处理之直方图均衡化,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • C++实现大整数乘法(字符串乘法)

    C++实现大整数乘法(字符串乘法)

    这篇文章主要为大家详细介绍了C++实现大整数乘法、字符串乘法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09
  • QT使用QML实现地图绘制虚线的示例代码

    QT使用QML实现地图绘制虚线的示例代码

    QML提供了MapPolyline用于在地图上绘制线段,这篇文章主要为大家详细介绍了QT如何使用QML实现在地图上绘制虚线,需要的小伙伴可以参考一下
    2023-07-07
  • 基础C语言编程时易犯错误有哪些

    基础C语言编程时易犯错误有哪些

    基础C语言编程时易犯错误有哪些?这篇文章主要介绍了C语言编程时常见的错误,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • 用C语言实现简单扫雷游戏

    用C语言实现简单扫雷游戏

    这篇文章主要为大家详细介绍了用C语言实现简单扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • VC++编程获取窗口句柄的方法小结

    VC++编程获取窗口句柄的方法小结

    这篇文章主要介绍了VC++编程获取窗口句柄的方法,简单总结分析了VC++获取窗口句柄的常见函数与使用技巧,需要的朋友可以参考下
    2017-07-07
  • C++中继承的概念和定义

    C++中继承的概念和定义

    这篇文章主要介绍了详解C++ 中的概念和定义,帮助大家更好的理解和学习使用c++,感兴趣的朋友可以了解下,希望能给你带来帮助
    2021-08-08
  • C语言读取和存储bmp格式图片

    C语言读取和存储bmp格式图片

    这篇文章主要为大家详细介绍了C语言读取和存储bmp格式图片,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • 基于C++的农夫过河问题算法设计与实现方法

    基于C++的农夫过河问题算法设计与实现方法

    这篇文章主要介绍了基于C++的农夫过河问题算法设计与实现方法,简单描述了农夫过河问题,并结合实例形式详细分析了基于C++实现农夫过河问题的相关算法实现步骤与操作技巧,需要的朋友可以参考下
    2017-09-09
  • 最新C语言自定义类型详解

    最新C语言自定义类型详解

    生活当中有很多物品是不能简单的用整型、浮点型、字符型来区分,它们常常是复杂的集合,比如人,一个人拥有年龄,身高、体重、学历......等信息,我们可以用结构体来实现准确描述人这种复杂集合,这篇文章主要介绍了C语言 自定义类型,需要的朋友可以参考下
    2023-01-01

最新评论