系统编程——管道通信

管道通信

Linux系统提供了一种通信方式,名字叫做管道通信,顾名思义,管道是单向的,比如水管、燃气管道等,换个说法就是管道是采用半双工通信的,也就是同一时刻只能完成发送数据或者接收数据。

匿名管道

匿名管道的特点是没有名称,所以用户无法使用open来创建和打开,但是匿名管道进行数据读写的方式和普通文件一样,都是支持read()/write()操作的。

匿名管道的创建

image
其中pipefd参数是一个数组类型,用于存储堆管道进行读写的文件描述符,pipefd[0]记录管道读取端的文件描述符,pipeifd[1]记录管道写入端的文件描述符
image

匿名管道的读写

对pipefd[0],pipefd[1]分别进行read与write的操作

有名管道

有名管道有文件名,可以被open,同样也支持read/write访问。

有名管道的创建

image
第一个参数是*const char *pathname,是创建的有名管道的文件路径
第二个参数是mode_t mode,是创建的有名管道的权限

有名管道的读写

open打开指定的有名管道后对其文件描述符进行read与write操作

管道读取数据的四种情况

image
image
image
image
总结:
如果一个管道的写端一直在写,而读端的引⽤计数是否⼤于0决定管道是否会堵塞,引用计数大于0,只写不读再次调用write会导致管道堵塞;
如果一个管道的读端一直在读,而写端的引⽤计数是否⼤于0决定管道是否会堵塞,引用计数大于0,只读不写再次调用read会导致管道堵塞;
而当他们的引用计数等于0时,只写不读会导致写端的进程收到一个SIGPIPE信号,导致进程终止,只写不读会导致read返回0,就像读到⽂件末尾⼀样。

思考:当一个管道写入10字节数据后,读取5字节数据,关闭管道再次打开,此时读取管道能否得到数据?

答:并不能读取到数据,进程阻塞直到写端有数据写入。因为管道通信是临时的内核缓冲区而不是持久化存储的通信方式,当其两个端口均关闭后,内容物会丢失。因此管道关闭后再打开是无法读取到之前尚未读取完毕的数据的。


管道间四种通信情况转载自:https://blog.csdn.net/skyroben/article/details/71513385

posted @   藍桉未遇釋槐鳥  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示