linux 匿名管道实例详解

发布时间 - 2026-01-11 01:59:59    点击率:

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

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


# linux  # 匿名管道  # 匿名管道详解  # Linux通过匿名管道进行进程间通信  # Linux管道揭秘之匿名管道连接进程世界的方法  # 是在  # 也有  # 就像  # 希望能  # 谢谢大家  # 有一个  # 血缘关系  # 实现了  # 以往  # int  # brush  # class  # pre  # cpp  # stdio  # gt  # string  # stdlib  # unistd  # include 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在IIS管理器中快速创建并配置网站?  java ZXing生成二维码及条码实例分享  Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案  laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法  JavaScript常见的五种数组去重的方式  Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程  如何在宝塔面板中创建新站点?  EditPlus中的正则表达式 实战(1)  百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧  ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】  Laravel如何实现文件上传和存储?(本地与S3配置)  Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康  JavaScript实现Fly Bird小游戏  如何用搬瓦工VPS快速搭建个人网站?  如何快速查询域名建站关键信息?  英语简历制作免费网站推荐,如何将简历翻译成英文?  jQuery validate插件功能与用法详解  Laravel API资源类怎么用_Laravel API Resource数据转换  Laravel Blade模板引擎语法_Laravel Blade布局继承用法  如何快速登录WAP自助建站平台?  微信公众帐号开发教程之图文消息全攻略  如何在阿里云服务器自主搭建网站?  PHP 500报错的快速解决方法  Python图片处理进阶教程_Pillow滤镜与图像增强  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  如何快速生成可下载的建站源码工具?  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  Java解压缩zip - 解压缩多个文件或文件夹实例  大同网页,大同瑞慈医院官网?  详解Android——蓝牙技术 带你实现终端间数据传输  Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优  浅谈Javascript中的Label语句  laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  Laravel Octane如何提升性能_使用Laravel Octane加速你的应用  如何在云指建站中生成FTP站点?  Laravel怎么实现支付功能_Laravel集成支付宝微信支付  QQ浏览器网页版登录入口 个人中心在线进入  Laravel如何实现全文搜索功能?(Scout和Algolia示例)  Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID  Laravel如何实现一对一模型关联?(Eloquent示例)  Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)  如何用wdcp快速搭建高效网站?  Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】  Python正则表达式进阶教程_复杂匹配与分组替换解析  WEB开发之注册页面验证码倒计时代码的实现  Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?