4

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

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

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

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

正如Synchronous and Overlapped Pipe I/O中所说,这应该是可能的:

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

4

2 回答 2

2

您需要做的就是为每个同时操作提供不同的 OVERLAPPED 结构。在您的情况下,这意味着两个线程中的每一个都需要自己的 OVERLAPPED 结构。由于线程可能正在运行不同的功能,这应该会自动发生,除非您使用全局变量将其搞砸。

请注意,从该示例开始会使事情变得过于复杂,该示例专注于使用重叠 I/O 以避免需要多个线程。

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

如果您无法使其工作,请显示您的代码。

于 2013-08-08T01:49:55.893 回答
1

正如管道文档所说,一个进程写入,另一个进程读取。如果你想读和写,你需要两个管道,一个用于“写入另一个进程”,一个用于“从另一个进程读取数据”。

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

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

虽然这个例子不会同时读写,但我认为它可以相对容易地被改变,这样它就可以了。

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

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

于 2013-08-03T21:53:36.103 回答