命名管道打开模式
管道服务器在 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,或者GENERIC_WRITE只写管道的FILE_READ_ATTRIBUTES。 以这种方式限制访问权限可为管道提供更好的安全性。
重叠模式
在重叠模式下,执行长时间读取、写入和连接作的函数可以立即返回。 这使线程能够在后台执行耗时的作时执行其他作。 若要指定重叠模式,请使用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访问权限打开管道句柄。