管道与命名管道有什么具体的应用场景吗

Viewed 93

进入看到进程间通信方式的时候看到了以下两种通信方式,但是没能想到这种通信方式的具体应用场景,有谁知道吗?
image.png

3 Answers

管道通常是在parent fork child的场景下用。首先,fork、exec操作使得管道的fd很容易在parent和child之间传递,一个进程close(pipe_fd[0])并使用pipe_fd[1],另一个进程close(pipe_fd[1])并使用pipe_fd[0]即可。管道通常在parent和child只需要传递简单的control、status时使用,也就是child只需要简单的告知parent自身的状态(status)如启动、关闭,parent也只是需要一个control管道通知child可以开始工作或者暂停工作。
命名管道自然就是在两者关系不是parent & child的情况下使用的,目前还用的不多。

管道的具体应用可以看看安全领域的AFL fuzz,简单来说就是fuzzer(parent)fork出forkserver(child),并指导forkserver对目标程序进行测试,而它们之间通信的内容仅包括几个很有限的状态:创建进程、开始运行、报告程序状态...。此外这个项目还使用了共享内存机制进行进程间通信。不过该项目比较复杂,不建议特别感兴趣的人花太多时间深究。

整体而言,进程间通信方式常见的无非三大类:网络、内存、文件。

网络通信方式可以依靠内核网络栈实现传输,用复杂的协议提升通信数据的表达能力,还可以一定程度保证数据的有序性、可靠性,实现跨设备的进程之间的通讯。但是相比于后两者肯定会多一些性能消耗,实现也不是特别方便。

内存,或者说共享内存,可以依靠物理内存映射实现快速的数据共享,降低进程间通信数据在内核中冗余的拷贝操作。在parent fork child的场景下或者对性能特别敏感的可以考虑,但是可能需要一些同步操作,保证访存顺序

个人认为管道应该算是这两者的折中吧。首先管道涉及到fd,还需要write、read系统调用,肯定是需要内核一定程度上的参与,但是其过程的复杂程度也肯定没有内核网络栈的高。相比于共享内存——两个进程开启后只需要cpu访存指令即可,管道不仅限制了传输的方式,还限制了传输方向。

欢迎提出见解并帮助改正。

主进程收到数据传给子进程去处理 处理完返回给主进程(盲猜)