概述
管道(Pipe)实际是用于进程间通信的一段共享内存,创建管道的进程称为管道服务
器,连接到一个管道的进程为管道客户机。一个进程在向管道写入数据后,另一进程就可
以从管道的另一端将其读取出来。匿名管道(Anonymous Pipes)是在父进程和子进程间
单向传输数据的一种未命名的管道,只能在本地计算机中使用,而不可用于网络间的通信。
匿名管道实施细则
匿名管道由 CreatePipe()函数创建,该函数在创建匿名管道的同时返回两个句柄:
管道读句柄和管道写句柄。CreatePipe()的函数原型为:
BOOL CreatePipe(PHANDLE hReadPipe, // 指向读句柄的指针
PHANDLE hWritePipe, // 指向写句柄的指针
LPSECURITY_ATTRIBUTES lpPipeAttributes, // 指向安全属性的指针
DWORD nSize // 管道大小
);
通过 hReadPipe 和 hWritePipe 所指向的句柄可分别以只读、只写的方式去访问管道。
在使用匿名管道通信时,服务器进程必须将其中的一个句柄传送给客户机进程。句柄的传
递多通过继承来完成,服务器进程也允许这些句柄为子进程所继承。除此之外,进程也可
以通过诸如 DDE 或共享内存等形式的进程间通信将句柄发送给与其不相关联的进程。
在 调 用 CreatePipe ( ) 函 数 时 , 如 果 管 道 服 务 器 将 lpPipeAttributes 指 向 的
SECURITY_ATTRIBUTES 数 据 结 构 的 数 据 成 员 bInheritHandle 设 置 为 TRUE , 那 么
CreatePipe ( ) 创 建 的 管 道 读 、 写 句 柄 将 会 被 继 承 。 管 道 服 务 器 可 调 用
DuplicateHandle()函数改变管道句柄的继承。管道服务器可以为一个可继承的管道句柄
创 建 一个不 可继承 的 副本 或 是为一 个不可 继 承 的 管道 句 柄 创 建 一 个 可 继 承的 副 本 。
CreateProcess()函数还可以使管道服务器有能力决定子进程对其可继承句柄是全部继
承还是不继承。
在生成子进程之前,父进程首先调用 Win32 API SetStdHandle()使子进程、父进程
可 共 用 标 准 输 入 、 标 准 输 出 和 标 准 错 误 句 柄 。 当 父 进 程 向 子 进 程 发 送 数 据 时 , 用
SetStdHandle()将管道的读句柄赋予标准输入句柄;在从子进程接收数据时,则用
SetStdHandle()将管道的写句柄赋予标准输出(或标准错误)句柄。然后,父进程可以
调用进程创建函数 CreateProcess()生成子进程。如果父进程要发送数据到子进程,父
进程可调用 WriteFile()将数据写入到管道(传递管道写句柄给函数),子进程则调用
GetStdHandle()取得管道的读句柄,将该句柄传入 ReadFile()后从管道读取数据。
如果是父进程从子进程读取数据,那么由子进程调用 GetStdHandle()取得管道的写
入句柄,并调用 WriteFile()将数据写入到管道。然后,父进程调用 ReadFile()从管道
读取出数据(传递管道读句柄给函数)。