匿名管道概述

【勇芳软件工作室】汉化HomePreviousNext

匿名管道的典型用途是通过重定向子进程的标准输入或标准输出句柄来创建父进程及其子进程之间的通信通道。要重定向子进程的标准输出句柄,父进程执行以下步骤:

1.选择GetStdHandle函数获取当前的标准输出句柄;保存手柄供以后使用。

2.选择CreatePipe函数创建一个匿名管道。该函数返回到管道读写端的句柄。

3.调用SetStdHandle函数将其标准输出设置为管道的写入句柄。

4.调用CreateProcess函数创建子进程。子进程继承父进程的可继承句柄。它还继承其父进程的标准句柄的值,它可以使用GetStdHandle函数检索。

5.将CloseHandle函数关闭,以关闭管道写入端的父级句柄。子进程继承此句柄后,父进程不再需要其副本。

6.将ReadFile函数从管道中读取。此操作使父进程能够读取子进程写入标准输出的数据。

子进程使用GetStdHandle函数获取其标准输出句柄,这实际上是管道写入端的句柄。然后,子进程使用WriteFile函数将其输出写入管道。

数据作为字节流写入匿名管道。这意味着从管道读取的进程无法区分写入单独写入操作的字节,除非读取和写入过程都使用一些允许读取进程知道要读取多少字节的协议。通常,没有协议,因此读取过程从管道读取,直到管道的所有写入句柄都关闭,这导致ReadFile函数返回FALSE。当子进程的标准输出重定向时,子进程调用CloseHandle或终止(自动关闭句柄)。请注意,在尝试从管道读取之前,父进程必须关闭管道写入端的句柄。否则,它的ReadFile操作不能返回FALSE,因为管道的写入端仍然有一个打开的句柄。

重定向标准输入的过程类似于用于重定向标准输出的过程,只是管道的读取句柄用于孩子的标准输入。在这种情况下,父进程必须确保子进程不会继承管道的写入句柄。否则,子进程的ReadFile操作不能返回FALSE,因为子进程对管道的写入端有一个打开的句柄。

父进程通常会创建管道的读取和写入句柄,以便它们可以由子进程继承。它通过使用CreatePipe,使bInheritHandle成员设置为TRUE来指定SECURITY_ATTRIBUTES结构来实现。当孩子的标准输入被重定向时,子进程不应该继承管道的写入句柄。父进程通过使用DuplicateHandle函数来创建不可重复的句柄副本,然后使用CloseHandle关闭可继承句柄来防止继承。

对于使用匿名管道重定向子进程的标准句柄的示例程序,请参阅进程和线程.