[C++] 匿名管道的理解与实现
2023-04-08 本文已影响0人
极速蜗牛2020
什么是匿名管道?
匿名管道用于进程之间通信,且仅限于本地父子进程之间通信,结构简单,类似于一根水管,一端进水另一端出水(单工)。相对于命名管道,其占用小实现简单,在特定情况下,比如实现两围棋引擎本地对战可以使用匿名管道。
怎样实现匿名管道双向通信?
由于匿名管道是单工的,所以为实现父子进程双向通信需要创建两根管道,并由子进程继承一根管道的读句柄和另一根管道的写句柄。
如何理解匿名管道的双向通信?
管道相当于一段内存,一个进程输入,一个进程读出。
在进程通信时一般会产生进程同步问题(进程同步讲解请见操作系统类书籍):父子进程各自均具有读写功能,在管道为空时,相应读进程应该被阻塞起来,直到管道被写入为止才被唤醒。
这种空管道不允许读的特性应当加一个锁,但匿名管道自带了这种功能,所以不需要对读写进行限制,其能自动阻塞。
实现双向通信
在父进程中创建两个匿名管道。此时父进程共有六个句柄Read1,Write1,Read2,Write2,标准输入输出句柄。

由图所示,标准输入输出句柄用于在Dos窗口的输入和输出。
然后我们需要让创建的子进程继承Write1句柄和Read2句柄。
