UNIX中管道的理解与实现

本文介绍了UNIX系统中管道的概念和工作原理,包括无名管道的特性,详细讲解了文件描述符、fork()、dup()、pipe()和execlp()等关键函数的作用。通过示例展示了如何使用这些概念实现管道通信,以及管道在进程通讯中的应用。

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

今天上课老师具体讲了管道在UNIX中的作用以及实现原理,自己下来琢磨了好一阵子,基本上搞清楚了,赶紧记在小本本上。

管道是什么

首先来看一个命令:

cat file1 file2 | sort

cat表示读取file1、file2中的数据,然后使用管道 |,将这些内容作为输入,使用sort函数作为输出,最后输出在屏幕上。

管道做了什么事

熟悉类UNIX系统的朋友一定经常使用管道,其实它就是用来做进程通讯的。我们很多时候需要将一个文件中的内容作为另一个文件的输入,或者将一个程序运行的结果作为另一个程序的输入,这时候管道就派上用场了。我们这里先只考虑无名管道

无名管道

  1. 只能用于具有亲缘关系的进程之间,父子进程,兄弟进程之间通信,因为只有子进程才能继续父进程的文件描述符。
  2. 半双共通信(同一时刻只能对管道进行一种操作(读操作或者写操作)),具有读端口和写端口。
  3. 管道是一种特殊的文件,可以使用文件I/O函数(read,write…)来操作,但不能使用lseek函数来定位操作。
  4. 管道是在内存中,不用我们主动去删除。
  5. 管道是基于队列实现的,有大小限制。

管道实现原理

相关概念与函数

文件描述符(File Descriptor)

对于内核而言,所有打开文件都是由文件描述符引用。文件描述符(fd)是一个非负整数。
当打开一个现存文件或者创建一个新文件时,内核向进程返回一个文件描述符。fd可以理解为一个文件的标识,系统调用中的opencreat都返回fd,并将其作为参数传给readwrite
通常情况,UNIX shell**使文件描述符0与进程的标准输入相结合文件描述符1与标准输出相结合文件描述符2与标准出错输出相结合**。
因此,文件描述符可以看成是文件描述符表的一个下标,我们可以通过这个fd访问文件的信息(fstate),也可以使用writeread对文件进行修改,具体细节可参考

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值