命名管道打开模式

管道服务器在 CreateNamedPipe 函数的 dwOpenMode 参数中指定管道访问、重叠和写通模式。 管道客户端可以使用 CreateFile 函数为其管道句柄指定这些打开模式。

访问模式

设置管道访问模式等效于指定与管道服务器的句柄关联的读取或写入访问权限。 下表显示了可使用 CreateNamedPipe 指定的每个访问模式的等效泛型访问权限。

访问模式 等效的泛型访问权限
PIPE_ACCESS_INBOUND GENERIC_READ
PIPE_ACCESS_OUTBOUND GENERIC_WRITE
PIPE_ACCESS_DUPLEX GENERIC_READ |GENERIC_WRITE

 

如果管道服务器使用 PIPE_ACCESS_INBOUND 创建管道,则管道服务器为只读管道,管道客户端为只读。 如果管道服务器使用PIPE_ACCESS_OUTBOUND创建管道,则管道服务器为只读管道,管道客户端为只读。 使用 PIPE_ACCESS_DUPLEX 创建的管道对于管道服务器和管道客户端都是可读/写的。

使用 CreateFile 连接到命名管道的管道客户端必须在 dwDesiredAccess 参数中指定与管道服务器指定的访问模式兼容的访问权限。 例如,客户端必须指定GENERIC_READ访问权限才能打开管道服务器使用 PIPE_ACCESS_OUTBOUND 创建的管道的句柄。 对于管道的所有实例,访问模式必须相同。

若要读取管道属性(如读取模式或阻止模式),管道句柄必须具有FILE_READ_ATTRIBUTES访问权限;若要写入管道属性,管道句柄必须具有FILE_WRITE_ATTRIBUTES访问权限。 这些访问权限可以与适用于管道的通用访问权限组合使用:GENERIC_READ具有只读管道的FILE_WRITE_ATTRIBUTES,或对只读管道使用FILE_READ_ATTRIBUTES GENERIC_WRITE。 以这种方式限制访问权限可为管道提供更好的安全性。

重叠模式

在重叠模式下,执行长时间读取、写入和连接操作的函数可以立即返回。 这使线程能够在后台执行耗时操作时执行其他操作。 若要指定重叠模式,请使用 FILE_FLAG_OVERLAPPED 标志。 有关详细信息,请参阅 同步和重叠输入和输出

CreateFile 函数允许管道客户端使用 dwFlagsAndAttributes 参数为其管道句柄设置重叠模式 (FILE_FLAG_OVERLAPPED) 。

Write-Through模式

使用 FILE_FLAG_WRITE_THROUGH 指定写通模式。 此模式仅影响对不同计算机上的管道客户端和管道服务器之间的字节类型管道的写入操作。 在写通模式下,写入命名管道的函数在数据通过网络传输并进入远程计算机上的管道缓冲区之前不会返回。 对于每个写入操作需要同步的应用程序,写通模式非常有用。

如果未启用写通模式,系统会通过缓冲数据来提高网络操作的效率,直到累积最小字节数或最长时间段已过。 缓冲使系统能够将多个写入操作合并到单个网络传输中。 这意味着,在系统将数据放入出站缓冲区之后,但在系统通过网络传输数据之前,写入操作可以成功完成。

CreateFile 函数允许管道客户端使用 dwFlagsAndAttributes 参数为其管道句柄设置写通模式 (FILE_FLAG_WRITE_THROUGH) 。 创建管道句柄后,无法更改管道句柄的写通模式。 对于同一管道实例的服务器和客户端句柄,写通模式可能不同。

管道客户端可以使用 SetNamedPipeHandleState 函数来控制禁用写通模式的管道的字节数和传输前的超时期限。 对于只读管道,必须使用GENERIC_READ打开管道句柄,并FILE_WRITE_ATTRIBUTES访问权限。