使用重叠的命名管道在Windows上同时读写

时间:2013-08-03 21:46:57

标签: c++ windows named-pipes overlapped-io

我有一个创建为重叠的管道句柄。我需要并行读取和写入数据。我怎样才能做到这一点?

Named Pipe Server Using Overlapped I/O文档页面显示了如何读取和写入多个管道的示例,但“它避免了对单个管道实例的同时操作”。

在Windows上使用C ++执行此操作的正确方法是什么?我无法提供正确的示例,也无法提供有关该主题的一些帮助。

当没有数据要读取并且最终无法使用WriteFile写入时,我面临的主要问题是正常的ReadFile会阻塞。我还没有找到任何方法可以告诉我有什么东西要读,不要阻止。据我所知,我需要传递OVERLAPPED结构,但不知道如何在并行读写一个管道(不是很多)的情况下使用它。

应该可以像Synchronous and Overlapped Pipe I/O中所说的那样:

  

重叠操作使得一个管道可以同时读取和写入数据,并且单个线程可以在多个管道句柄上同时执行I / O操作。

2 个答案:

答案 0 :(得分:3)

您需要做的就是为每个同步操作提供不同的OVERLAPPED结构。在您的情况下,所有这些意味着两个线程中的每一个都需要自己的OVERLAPPED结构。由于线程可能会运行不同的函数,因此除非您使用全局变量搞乱,否则这应该会自动发生。

请注意,从那个样本开始过度复杂化,重点是使用重叠的I / O来避免需要多个线程。

相反,假装您使用非重叠I / O编写两个函数中的每一个,但无论何时调用ReadFile或WriteFile,都要包含一个带有事件句柄的有效OVERLAPPED结构并跟进WaitForSingleObject。您应该知道一些事情:您必须确保每个线程都创建自己的事件对象,并且您必须处理I / O操作立即完成的情况(即,返回ERROR_SUCCESS而不是ERROR_IO_PENDING)。否则,这一切都相当简单。

如果无法正常使用,请显示您的代码。

答案 1 :(得分:1)

正如documentation for pipes所说,一个进程写入,另一个进程读取。如果要读取和写入,则需要两个管道,一个用于“写入另一个进程”,另一个用于“从另一个进程读取数据”。

[这不是Windows独有的,但由于您在询问Windows管道,我认为最好给出Windows文档。 Linux/Unix pipes是相同的方式 - 它们有两端,一个读端和一个写端]

当然,正如评论所说,似乎Windows文档相当矛盾(我一次只在一个方向上使用过windows管道)。

虽然this example不会同时读写,但我认为它可以相对容易地进行修改,以便它可以实现。

我怀疑(但由于代码未发布),问题出在ReadFile调用或设置管道本身。对ReadFile的重叠调用是异步的,在检查结果之前,您需要等待与WaitForMultipleObjects重叠结构相关的事件。

显然,如果你同时阅读和写作,你需要一个重叠的结构用于读取,一个用于写入,以指示哪一方“完成”。