进程间通信---有名管道&无名管道

本文介绍了进程间通信中的无名管道和有名管道。无名管道适用于父子进程,是半双工的,大小默认为64k,通过`pipe()`创建。有名管道可通过文件系统进行通信,不受亲缘关系限制,使用`mkfifo()`创建,可实现任意两个进程间的通信。两者的主要区别在于通信范围和是否存在于文件系统中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

顾名思义,管道就像是将数据放入到一个长长的管子中一样,肯定会有一端写入数据,称为写端,有一段读出数据,称为读端。既然是说像管子一样那么它肯定有大小吧,资源不是无穷无尽的,默认下管道的大小是64k,用ulimit -a 可以查看。

1、无名管道:

  1. 管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立两个管道
  2. 无名管道只能用于父子进程之间(因为父子进程共享打开的文件描述符)
  3. 无名管道对于管道两端的进程而言就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自己单独构成一种文件系统,并且只存在在内核中。(这也是他无法在没有亲缘关系的进程中使用的原因)
  4. 数据的读出和写入:一个进程向管道的一端写数据,另一个进程在管道的另一端读。

 

无名管道的创建:

Int pipe(int pipefd[2]);当一个管道创建时,它会产生两个文件描述符fd[0]和fd[1],分别为读端和写端。现在假设fork()创建一个新进程,父进程负责向管道中写数据,子进程复制读数据。那么父进程要关闭读端,子进程要关闭写端。

规则:

  1. 写端不存在时,则认为已经读到数据的尾部,读函数返回读到的字节数为0
  2. 写端存在时,如果写的字节数大于PIPE_BUF(管道默认大小65535,64k)则返回管道现有数据,如果小于PIPE_BUF,则返回实际大小。
  3. 当写端存在,管道没有数据时,读取管道时会阻塞
  4. 当读端存在时,向管道中写数据才有意义。否则,管
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值