匿名管道

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

一个【匿名管道】是一个未命名的单向管道,用于在父进程和子进程之间或同一父进程的两个子进程之间传输数据。虽然可以使用匿名管道进行无关的进程之间的通信,但是为了达到目的,更容易使用命名管道(更多信息,请参见命名管道)。匿名管道总是本地的;它们不能用于通过网络进行通信。

CreatePipe函数创建一个匿名管道,并返回两个句柄,一个到读取端,一个写入管道的写入端。读取句柄只读取对管道的访问权限,写入句柄只有对管道的写入权限。要通过管道进行通信,其中一个端点的句柄必须传递给另一个进程。通常,这是通过继承完成的;也就是说,子进程从其父进程继承一个句柄。这些句柄的可继承性由创建过程以下列方式控制:

* CreatePipe函数指定SECURITY_ATTRIBUTES结构。如果此结构的bInheritHandle成员为TRUE,则可以继承该句柄。

* DuplicateHandle功能可以更改管道句柄的可继承性。此函数使进程能够创建可继承的管道句柄的不可重复的副本,或创建不可继承的管道句柄的可继承副本。

* CreateProcess函数使父进程能够指定新的子进程是否将继承全部或不是父进程的可继承句柄。

当子进程继承句柄时,系统将使进程访问该句柄所引用的管道。但是,父进程必须将该句柄值传递给子进程。通常,这通过使用SetStdHandleGetStdHandle功能完成,该函数设置和检索进程的标准句柄(标准输入,标准输出或标准错误)。父进程可以在创建子进程之前调用SetStdHandle中指定管道句柄。父进程的当前标准句柄由子进程继承。因此,当子进程启动时,可以使用GetStdHandle函数来检索句柄值。父进程可以更改其自己的标准句柄,而不会影响其现有子进程的标准句柄。

要从管道读取,一个进程在调用ReadFile函数时使用读取句柄。当任意数量的字节的写操作完成时,ReadFile调用返回。当管理的写入端的所有句柄都已关闭或在读取操作正常完成之前发生任何错误时,ReadFile调用也将返回。

要写入管道,一个进程在调用WriteFile函数时使用写入句柄。WriteFile不会返回,直到指定的字节数被写入或发生错误。如果管道的缓冲区已满,并且字节保留写入,则WriteFile不会返回,直到其他进程或线程从管道读取,从而使更多缓冲区可用。CreatePipe使创建过程能够指定管道的缓冲区大小,也可以使用默认缓冲区大小。

匿名管道不支持异步(重叠)读写操作。这意味着ReadFileExWriteFileEx功能不能与匿名管道一起使用。使用匿名管道时,ReadFileWriteFile功能的【lpOverLapped】参数将被忽略。

存在一个匿名管道,直到管道的读取和写入端的所有句柄都被CloseHandle函数关闭。