linux进程通信———无名管道

本文深入探讨Linux进程间的无名管道通信,包括其局限性、创建方法、代码实例及内核实现。无名管道适用于父子进程间单向或双向数据传输,通过pipe()或pipe2()函数创建,其数据流受限于单向且在有共同祖先的进程中使用。文中还提供了具体的代码示例展示如何实现数据传递。
摘要由CSDN通过智能技术生成

linux进程通信———无名管道

引言:打算认认真真实践一下进程间通信的几种方式,本篇笔记介绍了管道局限性、创建方式、代码实例、内核实现。建议感兴趣的同学,以书籍为主,建立系统知识,书本远远比博客深邃。


一、无名管道简介

1.1、局限性:

  管道是最初的unix IPC(interprocess communication)形式,其本身存在两个局限性:首先管道没有名字,他们只能在具有共同祖先的进程间使用,一般用于父子进程;其次历史上管道是半双工的,即数据只能在一个方向流动。

1.2、创建:

  所有式样的Unix都提供管道,它由pipe()函数创建,提供一个单向的数据流。pipe2()与pipe()区别在于增加了flags标志位,可以通过标志位O_NONBLOCK、O_CLOEXEC设置所创建管道的状态。

这里写图片描述
图1、pipe()函数man手册

  该函数返回两个文件描述符:fd[0]和fd[1],前者打开来读,后者打开来写。图2展示了单个进程中管道的样子:

这里写图片描述
图2、单个进程中的管道

  尽管管道是单个进程创建的,但是其很少在单个进程内使用,管道的典型用途是为父子进程提供进程间通信的手段。首先,其由一个进程(它将成为父进程)创建一个管道后调用fork派生一个自身的副本,如图3所示:

这里写图片描述
图3、进程创建管道后执行fork

  接着父进程关闭这个管道的读出端,子进程关闭同一管道的写入端,这就在父子进程间提供了一个单向的数据流,如图4所示:

这里写图片描述
图4、单个进程间的管道

  到目前为止所示的所有管道都是半双工即单向的,只提供一个方向的数据流,可以创建两个管道,父子进程各关闭相应的读写,其实际步骤如下:

1)、创建管道1(fd1[0]和fd1[1])和管道2(fd2[0]和fd2[1]);
2)、fork创建子进程
3)、父进程关闭管道1的读出端(fd1[0]),父进程关闭管道2的写入端(fd2[1]);
4)、子进程关闭管道1的写入端(fd1[1]),子进程关闭管道2的读出端(fd2[0]);

这里写图片描述
图5、提供一个双向数据流的两个管道


二、代码实例

2.1、父子进程单向传送数据:
/*******************************************************
*内容:IPC管道代码测试
*时间:2018年3月30日
*逻辑:父进程读取argv接收的字符串,将其通过管道传递给子进程,打印
*问题:在计算输入字符串长度时,开始用了sizeof(argv[1]),字符串传递不完整
       想起sizeof()运算符仅返回类型长度,argv[1]是指针,改用strlen   
*******
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值