大家好,我是菲英。
在前两个章节中呢,我们分别介绍了 Linux系统 的文件系统模块和内存管理模块。今天呢,我们就要进入下一个章节的介绍:进程间通信模块。
本期我们就从 N 多个美团面试经验都出现过的面试题开始本模块,它就是管道。
什么是管道?管道有几种呢?
管道(Pipe):是一种重要的进程间通信(IPC)机制。
它使得一个向管道中写入数据的进程(通常称为“写进程”)将其写入的数据作为输入传递给在管道另一边接收数据的进程(称为“读进程”)。
它分为匿名管道和有名管道(命名管道)。
匿名管道是什么?
首先,我们该如何使用它呢?
1、在程序中使用
在程序中需要使用系统调用(如pipe()函数)创建。
由于匿名管道没有名字,因此只能在创建它们的进程及其子进程之间使用。
2、在 shell 中使用
在shell命令中使用管道符号 “|” 连接两个命令时,就会创建一个匿名管道。
ls | grep "pattern"
然后,它的工作原理是什么呢?
它其实就是内核中的一块缓冲区,存在于内存之中。当缓冲区满的时候写操作会被阻塞,当缓冲区空的时候则读操作会被阻塞。

最后就是它有什么特点呢?
单向通信:
匿名管道是单向的,数据在同一时间内只能从一个进程流向另一个进程。如果需要双向通信,则需要创建两个管道。
亲缘关系限制:
匿名管道只能用于具有亲缘关系的进程之间(如 fork()出来的 父子进程)。这是因为匿名管道没有实体文件与之关联。
它是只存在于内存中的结构,无法通过网络或其他方式在不相关的进程间传递。
进程结束则它也结束:
匿名管道的生命周期和进程的生命周期一样。
当所有使用这个管道的进程都终止时,管道也会自动消失。
传输字节流:
管道传输的数据是无格式的字节流。
这意味着发送方和接收方需要像实现一个简单的协议一样约定数据的格式。
那有名管道又是什么呢?
首先要了解的当然是怎么创建它了
1、程序中创建(应用中其实一般是提前新建好而不是在业务进程中新建)
C语言:FIFO_PATH 为管道文件的路径
mkfifo(FIFO_PATH, 0666);
shell 中新建
mkfifo mypipe
然后,它的工作原理是什么呢?
它其实就是一种抽象,它的本质和无名管道相同。
只不过,它在文件系统中有一个可见的文件名(管道文件)。
这使得任何有权限的进程都可以通过打开这个文件来进行读写操作,从而实现了没有亲缘关系的进程间的通信。
同理,它的特点是什么呢?
最显著的特点就是进程间不需要有亲缘关系也可以使用有名管道
与匿名管道不同,有名管道可以在不相关的进程之间使用。
只要进程知道有名管道的路径名并具有相应的访问权限,就可以打开管道进行读写操作。
还有一个不容易注意到的特点是持久性
有名管道文件是持久的,与创建它的进程无关。
即使创建它的进程退出,有名管道文件仍然存在于文件系统中,可以由其他进程打开和使用。
这意味着,如果不显式删除有名管道文件,它将一直存在于文件系统中。
最后就是它们的主要区别表了,大家可以保存好,比较直观:


Linux管道:匿名与有名管道详解

被折叠的 条评论
为什么被折叠?



