匿名管道操作

CreatePipe 函数创建匿名管道并返回两个句柄:管道的读取句柄和管道的写入句柄。 读取句柄对管道具有只读访问权限,写入句柄对管道具有只读访问权限。 若要使用管道进行通信,管道服务器必须将管道句柄传递给另一个进程。 通常,这是通过继承完成的;也就是说,进程允许子进程继承句柄。 进程还可以使用 DuplicateHandle 函数复制管道句柄,并使用某种形式的进程间通信(例如 DDE 或共享内存)将其发送到不相关的进程。

管道服务器可以将读取句柄或写入句柄发送到管道客户端,具体取决于客户端是应使用匿名管道发送信息还是接收信息。 若要从管道读取数据,请在调用 ReadFile 函数时使用管道的读取句柄。 当另一个进程写入管道时, ReadFile 调用将返回。 如果管道的所有写入句柄都已关闭,或者在读取操作完成之前发生错误, ReadFile 调用也可以返回 。

若要写入管道,请在调用 WriteFile 函数时使用管道的写入句柄。 WriteFile 调用在将指定字节数写入管道或发生错误之前不会返回。 如果管道缓冲区已满,并且有更多字节要写入, 则 WriteFile 不会返回,直到另一个进程从管道读取,从而提供更多的缓冲区空间。 管道服务器在调用 CreatePipe 时指定管道的缓冲区大小。

匿名管道不支持异步 (重叠) 读取和写入操作。 这意味着不能将 ReadFileExWriteFileEx 函数用于匿名管道。 此外,当这些函数与匿名管道一起使用时,将忽略 ReadFileWriteFilelpOverlapped 参数。

匿名管道存在,直到所有管道句柄(读取和写入)都已关闭。 进程可以使用 CloseHandle 函数关闭其管道句柄。 当进程终止时,所有管道句柄也会关闭。

匿名管道是使用具有唯一名称的命名管道实现的。 因此,通常可以将匿名管道的句柄传递给需要命名管道句柄的函数。