阻塞和非阻塞管道操作

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

管道句柄的等待模式(阻塞或非阻塞)确定在否则需要无限期等待的情况下,ReadFileWriteFileConnectNamedPipe函数是否立即返回。默认情况下,CreateNamedPipeCreateFile函数返回的所有命名管道句柄都将启用阻塞等待模式。可以通过在CreateNamedPipe中指定PIPE_NOWAIT来为服务器的管道句柄启用非阻塞等待模式。服务器和客户端进程都可以通过在调用SetNamedPipeHandleState函数中指定PIPE_WAIT或PIPE_NOWAIT来更改管道句柄的等待模式。

请注意,与Microsoft LAN Manager 2.0版兼容,支持非阻塞等待模式,不应使用命名管道实现重叠输入和输出(I / O)。应该使用重叠的I / O,因为它可以在函数返回后在后台执行耗时的ReadFileWriteFileConnectNamedPipe操作。有关重叠I / O的更多信息,请参阅同步和重叠输入和输出.

当管道为空时,ReadFile操作受到管道手柄的等待模式的影响。使用阻塞等待句柄,直到从线程写入到管道另一端的数据可用之前,操作才能成功完成。使用非阻塞等待句柄,函数立即返回FALSE,GetLastError函数返回ERROR_NO_DATA。

当管道缓冲区中的空间不足以容纳所有数据时,WriteFile操作受管道句柄等待模式的影响。使用阻塞等待句柄,写操作无法成功,直到通过从管道另一端读取线程在缓冲区中创建足够的空间。使用非阻塞等待句柄,写操作立即返回TRUE,而不会写入任何字节(对于消息类型的管道)或写入与缓冲区保持的字节数一样多的字节类型的管道。

当没有客户端连接或等待连接到管道实例时,ConnectNamedPipe操作受管道句柄的等待模式的影响。使用阻塞等待句柄,直到客户端进程通过调用CreateFileCallNamedPipe 函数连接到管道实例,连接操作才会成功。使用非阻塞等待句柄,连接操作立即返回FALSE,并且GetLastError函数返回ERROR_PIPE_LISTENING。

使用TransactNamedPipeCallNamedPipe功能时,管道手柄的等待模式不影响读取或写入操作。