管道/命名管道

本文详细介绍了Unix系统中的匿名管道和命名管道。匿名管道是单向数据通道,适用于父子进程间通信,遵循POSIX协议,具有原子写入特性。命名管道则允许不相关进程间通信,存在于文件系统中,可通过文件名访问。文章讨论了如何在程序中创建和使用管道,包括pipe()函数、阻塞I/O、popen()和pclose(),以及如何在命令行层面实现管道操作。此外,还对比了匿名管道和命名管道的异同,并展示了如何创建和使用命名管道。
摘要由CSDN通过智能技术生成

匿名管道:

概述:

用于Unix系列系统。单向数据通道,写端写的数据在被读端读取之前会被操作系统缓存。双向管道需要通过创建两个单向管道实现

之所以是匿名的。是因为匿名管道不存在于文件系统中,随着使用它的进程结束而结束,没有名称。没有特别指明的话,管道指匿名管道。

管道为多个文件创建了临时的直接连接,这使得整合起来的管道整体性能比各个程序分别运行要高。这种直接连接使得程序可以同时运行,并且允许数据直接在它们之间连续的传输而不必将数据传到临时文件中或是显示器上然后等待前一个程序执行完后一个才可以执行。如果写入程序写的快于读取程序,写入程序就会被阻塞并等待数据被读取;相反的,读取程序就会被阻塞等待数据被写入(如果设置为阻塞读写的话)。

文件描述符:当打开文件之后,系统会为其维护一个描述文件的实体,相应的,这个实体会有一个整数作为其描述符,通过这个整数就可以访问这个文件描述实体。所以在通过文件描述符使用文件的功能中,可以通过改变文件描述符实际指向的内容来实现输入输出流的改变。使用fopen()返回的文件结构体struct FILE(即struct _IO_FILE)中的_fileno字段表示文件描述符。文件描述符0/1/2分别为标准输入输出错误流,所以新打开的文件会从3开始使用并随着打开的文件增长

在程序中使用管道

Unix系列系统通过pipe()函数创建新的管道。包含在头文件unistd.h中。原型:int pipe(int filedes[2]);

返回值:成功返回0,失败返回-1

参数:一个2个元素的文件描述符数组,成功创建的话,函数将在其中分别放置读端(filedes[0])和写端(filedes[1])

read()向写端写,read()向读端读。参数为文件描述符、存放位置、读/写大小。默认情况下读取是阻塞的,只要有写端是打开的,就会一致阻塞地等待需要的数据

从管道中读取:

读取时

管道中

字节数(p)

至少有一个进程有打开的写端 没有进程有打开的写端
阻塞读 非阻塞读
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值