0

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

另一个进程,在读取的时候,先读取第一个msg,然后根据从第一个msg得到的信息读取第二个msg。

我的问题是:

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

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

谢谢

4

1 回答 1

3

管道有点像真正的管道——当您向管道写入更多内容时,它不会覆盖管道中已经存在的内容。它只是将更多数据添加到管道中,这些数据将在您之前写入管道的数据之后传递。

我很少发现WaitForSingleObject对管道有用。如果你想阻塞当前线程直到它从管道接收到数据,你可以做一个同步读取,它会阻塞直到有数据。如果你想阻塞直到有来自多个源中的任何一个输入,你通常想要WaitForMultipleObjectsor MsgWaitForMultipleObjects,所以当任何源有输入要处理时,你的线程将运行。

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

说了这么多,我觉得有必要指出我已经有一段时间没有使用命名管道编写任何新代码了。我能想到的情况很少,今天我什至会考虑它们——我几乎总是使用套接字。

于 2013-02-18T23:18:01.607 回答