命名管道类型、读取和等待模式

管道服务器在 CreateNamedPipe 函数的 dwPipeMode 参数中指定管道类型模式、读取模式和等待模式。 管道客户端可以使用 CreateFile 函数为管道句柄指定这些管道模式。

类型模式

管道的类型模式确定将数据写入命名管道的方式。 可以通过命名管道以字节流或消息流的形式传输数据。 管道服务器在调用 CreateNamedPipe 以创建命名管道的实例时指定管道类型。 对于管道的所有实例,类型模式必须相同。

若要创建字节类型管道,请指定PIPE_TYPE_BYTE或使用默认值。 数据以字节流的形式写入管道,并且系统不区分以不同写入作写入的字节。

若要创建消息类型管道,请指定PIPE_TYPE_MESSAGE。 系统将每个写入作中写入的字节视为消息单元。 系统始终对消息类型管道执行写入作,就像启用了写通模式一样。

读取模式

管道的读取模式确定如何从命名管道读取数据。 管道服务器在调用 CreateNamedPipe时指定管道句柄的初始读取模式。 数据可以在字节读取模式或消息读取模式下读取。 字节类型管道的句柄只能处于字节读取模式。 消息类型管道的句柄可以处于字节读取模式或消息读取模式。 对于消息类型管道,对于服务器和客户端句柄,读取模式可以不同于同一管道实例。

若要在字节读取模式下创建管道句柄,请指定PIPE_READMODE_BYTE或使用默认值。 数据作为字节流从管道中读取。 读取作在读取管道中的所有可用字节或读取指定字节数时成功完成。

若要在消息读取模式下创建管道句柄,请指定PIPE_READMODE_MESSAGE。 数据作为消息流从管道中读取。 仅当读取整个消息时,读取作才会成功完成。 如果指定的读取字节数小于下一条消息的大小,则函数在返回零之前读取尽可能多的消息(GetLastError 函数返回ERROR_MORE_DATA)。 可以使用另一个读取作读取消息的其余部分。

对于管道客户端,CreateFile 返回的管道句柄最初始终处于字节读取模式。 管道客户端和管道服务器都可以使用 SetNamedPipeHandleState 函数来更改管道句柄的读取模式。 管道句柄必须具有FILE_WRITE_ATTRIBUTES访问权限。

等待模式

管道句柄的等待模式确定 ReadFileWriteFile,以及 ConnectNamedPipe 函数如何处理冗长的作。 在阻塞等待模式下,函数无限期地等待管道另一端的进程来完成作。 在非阻止等待模式下,函数会在需要无限期等待的情况下立即返回。

当管道为空时,ReadFile作受管道句柄的等待模式影响。 使用阻塞等待句柄,在将数据从写入管道的另一端的线程中获取之前,作不会成功完成。 使用非阻塞等待句柄,函数将立即返回零,GetLastError 函数返回ERROR_NO_DATA。

当管道缓冲区中空间不足时,WriteFile作受管道句柄等待模式的影响。 使用阻塞等待句柄,写入作将无法成功,直到从管道的另一端读取线程在缓冲区中创建足够的空间。 使用非阻止等待句柄时,写入作会立即返回非零值,而无需写入任何字节(对于消息类型管道),或在写入缓冲区保留的任意字节之后(对于字节类型管道)。

当没有客户端连接或等待连接到管道实例时,ConnectNamedPipe作会受到管道句柄的等待模式的影响。 使用阻塞等待句柄,在管道客户端通过调用 CreateFileCallNamedPipe 函数连接到管道实例之前,连接作不会成功。 使用非阻止等待句柄,连接作将立即返回零,GetLastError 函数返回ERROR_PIPE_LISTENING。

默认情况下,CreateNamedPipeCreateFile 函数返回的所有命名管道句柄都已启用阻塞等待模式。 若要在非阻止等待模式下创建管道,管道服务器在调用 CreateNamedPipe时指定PIPE_NOWAIT。

管道客户端和管道服务器都可以通过在调用 SetNamedPipeHandleState 函数中指定PIPE_WAIT或PIPE_NOWAIT来更改管道句柄的等待模式。

注意

支持非阻止等待模式,以便与 Microsoft LAN Manager 版本 2.0 兼容。 不应使用此模式来实现具有命名管道的重叠输入和输出(I/O)。 应改用重叠的 I/O,因为它允许在函数返回后在后台运行耗时的作。 有关重叠 I/O 的详细信息,请参阅 同步和重叠输入和输出