2009-10-13 80 views
1

是否有一个函数在另一端成功调用管道上的ReadFile时返回。 我有2个应用程序在一个命名管道上进行通信,一个使用WriteFile在管道上发送请求,并期待一个答案,以便它调用ReadFile。问题在于应用程序正在读取自己的请求作为答案,因为另一端并未将其从管道中移除。命名管道问题

有没有这样的功能?

我知道另一种方法是使用2个单向管道或通过让其他应用程序在发送消息时发送信号给发送者来实现某种类型或同步,但我只是检查是否有更简单的方法。

回答

1

我认为你正在寻找的方法是PeekNamedPipe。此功能将允许您查看管道而不删除数据。您可以使用它来检查并查看刚刚发送的消息是否仍在管道中。如果是这样,那么另一端还没有读取消息。

总的来说,我认为你最好用一个信号或两个单向管。他们更适合进行双向沟通。

+0

我会告诫不要在这里使用PeekNamedPipe()。当你的程序从PeekNamedPipe()返回时,如果两个进程同时在管道上读/写,这会变得有问题并容易出现竞争,因为你永远无法依赖它返回的值,到你的ReadFile()调用。 – asveikau 2009-10-13 22:36:28

+0

@asveikau,完全同意。这就是为什么我建议信号或2管。一个管道本质上是一个有保证的竞争条件 – JaredPar 2009-10-13 22:39:55

+0

另外,还有什么可以说另一个应用程序没有读取您在管道上发布的数据,并简单地直接写回来,现在正在等待您...... – ScaryAardvark 2010-01-20 08:41:15

0

您的设计天生就容易出现竞争状况,我会敦促您改用两根管子。特别是,你是否考虑过当两个进程想要写入同一个管道时会发生什么?

这就是说...您可以使用event进行同步。在完成WriteFile()之后,您可以使用wait来发送事件信号。当另一端用ReadFile()完成时,它可以是SetEvent()。如果两端有明确的合同,不会彼此竞争或彼此僵持,这可能会奏效。