命名管道打开模式

管道服务器在 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访问权限打开管道句柄。