第一时间关注Linux技术干货!
本文字数:2014字
阅读时间:6分钟
作者
良许
一个热爱技术的程序猿
1
(无名)管道的缺点
通过上一篇博文,我们知道,无名管道的一个最大的优点就是「简单」,但也有几个很重要的缺点:
只能应用于有血缘关系的进程间,比如父子进程,兄弟进程;
管道的缓冲区大小受限,通常为一页,4k大小;
所传送的是无格式字节流,需提前约定好数据格式。
2
有名管道概念
正是为了克服无名管道的那些缺点,才提出了有名管道这种IPC方式。有名管道提出了一个路径名与之相关联,以FIFO的形式存在于文件系统中的通信方式。通过这种机制,它实现了非血缘关系之间的进程可以通信。
管道建立以后,进程可以对其像文件一样进行操作,可以使用open,read,write,close函数,但不能使用lseek函数。
FIFO严格遵守先进先出(first in first out)原则,对管道的读总是从开始处返回数据,对管道的写总是把数据添加到末尾。
3
有名管道的读写操作
对于读进程:
如果进程以阻塞方式打开管道,即open函数未使用O_NONBLOCK标志,并且当前FIFO是空的,则读进程将一直阻塞,直到有数据写入;
如果进程以非阻塞方式打开管道,即open函数使用了O_NONBLOCK标志,则不管当前FIFO是否是空的,读进程将立即读取。
对于写进程:
如果进程以阻塞方式打开管道,即open函数未使用O_NONBLOCK标志,并且当前FIFO是满的,则写进程将一直阻塞,直到有数据被读走;
如果进程以非阻塞方式打开管道,即open函数使用了O_NONBLOCK标志,则不管当前FIFO是否是空的,写进程将立即执行写操作。如果写入失败将返回错误。
例程:
读进程:
写进程:
本公众号全部博文已整理成一个目录,请在公众号里回复「m」获取!
领取专属 10元无门槛券
私享最新 技术干货