【问题标题】:Usage of overlapped named pipe for simultaneous read and write on Windows在 Windows 上使用重叠命名管道进行同时读写
【发布时间】:2013-08-03 21:46:56
【问题描述】:

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

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

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

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

Synchronous and Overlapped Pipe I/O说的应该是可以的:

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

【问题讨论】:

  • 我还没有找到任何方法可以告诉我有什么东西可以阅读并且不会阻塞。” - 看看PeekNamedPipe()

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


【解决方案1】:

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

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

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

如果你不能让它工作,显示你的代码。

【讨论】:

    【解决方案2】:

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

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

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

    虽然this example 不会同时读写,但我认为它可以相对轻松地进行更改,使其可以做到。

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

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

    【讨论】:

    • 正如Synchronous and Overlapped Pipe I/O documentation 所说:重叠操作使一个管道可以同时读取和写入数据,并且单个线程可以在多个管道句柄上同时执行 I/O 操作。
    • 好的,我正在调查。
    • @DmitryTrofimov:正如我的编辑所说,我认为你需要展示你在做什么(如果可能的话,在一个小的、完整的、可编译的例子中)。
    • 所以这就是我问这个问题的原因:如何轻松更改示例以使用一个管道?我什么时候需要写、读和等待?我应该等待什么事件?
    • 您需要(至少)一个重叠的结构,其中每个都有一个事件用于读取和写入。您调用ReadFile 来为从另一端到达的某些数据设置触发器。当你有一些数据要写时,你打电话给WriteFile。如果您调用了ReadFileWriteFile,则在相应事件“触发”之前,您不应再次调用其中任何一个。有几十种不同的方法可以实现这一点,“正确”或“错误”取决于您实际尝试做的事情。
    猜你喜欢
    • 1970-01-01
    • 2019-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多