Namedpipe writeFIle问题Win32

时间:2013-02-18 23:01:47

标签: winapi named-pipes

我正在编写一个win32应用程序,它使用namedpipe进行进程间通信。当一个进程尝试writeFile时,它将写入结构(告诉其他进程多少字节和其他信息),然后它将通过再次调用WriteFile来写入实际数据。

另一个进程,在读取时,它会读取第一个msg,然后根据第一个msg中获取的信息读取第二个msg。

我的问题是:

  1. 如果服务器进程正在写入数据,但客户端进程尚未读取,则客户端正在读取时是否可能丢失第一个消息?例如,当服务器第二次调用WriteFile写入实际数据时,是否会覆盖之前的msg?

  2. 有没有使用waitforsingleobject进行同步的最佳解决方案?

  3. 由于

1 个答案:

答案 0 :(得分:3)

管道有点像真正的管道 - 当你向管道写更多时,它不会覆盖管道中已有的管道。它只是将更多数据添加到将在您先前写入管道的数据之后传递的管道。

我很少发现WaitForSingleObject对管道有用。如果要阻止当前线程直到它从管道接收数据,您可以只进行同步读取,并且它将阻塞直到有数据。如果你想阻止来自任何一个来源的输入,你通常需要WaitForMultipleObjectsMsgWaitForMultipleObjects,所以你的线程将在任何来源有输入处理时运行。

我在管道上使用WaitForSingleObject回忆的唯一一次是零超时,所以如果没有管道输入,接收器将继续其他处理,并且每隔一段时间检查管道是否有一些要处理的数据。虽然最初似乎PeekNamedPipe对此有用,但它对于其他目的来说确实最有用 - 虽然它可能对您有用,但是读取标题数据并找出要调用的其他代码以读取和处理整个消息。

说了这么多,我觉得有必要指出我在相当长一段时间内没有使用命名管道编写任何新代码。我可以想到今天我甚至会考虑它们的情况很少 - 我几乎总是使用套接字。