进程通信之管道(PIPE)

本文深入探讨了进程通信中的匿名管道,包括其定义、特性以及在Linux下的实现。匿名管道是用于父子进程或兄弟进程间通信的机制,具有半双工、FIFO规则和依赖文件系统的特性。通过`pipe()`函数创建管道,并通过文件描述符进行读写操作。文章通过示例阐述了管道的使用,并提到了命名管道(FIFO)作为扩展,允许不相关进程间通信。
摘要由CSDN通过智能技术生成

在前面进程通信概念和进程通信方式,我们了解了进程通信的简单概念以及4种进程通信的方式,今天我们将要通过具体实例来学习,理解进程通信方式中的管道(PIPE)

本文所有代码都在Ubuntu16.04测试。


我们在前面已经了解了常用的进程间通信方式,它们大致可以以如下方式分类:

A. 传统的进程间通信方式
无名管道(pipe)、有名管道(fifo)和信号(signal)

B. System v IPC对象
共享内存(share memory)、消息队列(message queue)和信号量(semaphore)

C. BSD
套接字(socket)

截取网上的一张图:

这里写图片描述

今天,我们主要聊聊无名管道,以及有名管道。


定义和特性

首先什么叫管道?

在聊管道之前,我们先看看管道是干嘛的?管道是用于进程通信的一种方式,说白了就是有两个或者多个进程要相互发送,接收信息,那么问题来了,我们知道进程的地址空间是各自独立的,(数据段写时拷贝,代码段共享),如果想对两进程AB里面数据共享操作,那么必须要有一种机制来保证,而管道就是这样的一种机制。

管道就是操作系统在内核中开辟的一段缓冲区,进程1可以将需要交互的数据拷贝到这段缓冲区,进程2就可以读取了,类似于下面这张图。

这里写图片描述

说白了,管道就有点像文件,将需要的数据放在这样一个文件里面,进程1向文件中写,进程2从文件中读。

管道有两种:

  1. 匿名管道
  2. 命名管道

说实在点,这两者区别不是很大,如果把管道理解为文件,命名管道就是知道名字的文件,匿名就是不知道名字的文件,当然了,它俩还是有区别的,最大的区别就是命名管道支持不相关进程通信,而匿名管道只支持有血缘关系的进程通信,比如父子进程,兄弟进程等等。。。由于区别不大,我们先讲述匿名管道,命名管道基本类似。

匿名管道有如下特性:

1、半双工通信(单向通信),数据在同一时刻只能在一个方向上流动。数据只能从管道的一端写入,从另一端读出。从管道读数据是一次性操作,数据一旦被读走,它就从管道中被抛弃,释放空间以便写更多的数据。
2、写入管道中的数据遵循先入先出(FIFO)的规则。
3、面向字节流。管道所传送的数据是无格式的,这要求管道的读出方与写入方必须事先约定好数据的格式,如多少字节算一个消息等。
4、依赖于文件系统,生命周期随进程结束而结束
5、匿名管道没有名字,只能在具有公共祖先的进程(父进程与子进程,或者两个兄弟进程,具有亲缘关系)之间使用。(常用于父子进程通信)
6、同步机制

在Linux下,管道是由pipe这个函数创建:

int pipe(int filedes[2]);
功能: 创建无名管道。
参数: filedes为 int 型数组的首地址,其存放了管道的文件描述符 filedes[0]、filedes[1]。
当一个管道建立时,它会创建两个文件描述符 fd[0] 和 fd[1]。其中 fd[0] 固定用于读管道,而 fd[1] 固定用于写管道。
返回值:成功:0 ; 失败:-1


1 . 当我们在父进程中创建了一个管道,它大概就是这样的:

这里写图片描述

当一个管道建立时,它会创建两个文件描述符 fd[0] 和 fd[1]。其中 fd[0] 固定用于读管道,而 fd[1] 固定用于写管道。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值