【问题标题】:Interactive pipe in C++C++ 中的交互式管道
【发布时间】:2013-01-16 18:15:25
【问题描述】:

我需要执行一个外部程序并交替访问它的标准输入和标准输出,就像控制台终端本身一样。我使用了 popen(),但它不提供双向管道。使用 pipe() 和 fork() 也不能交互工作,因为必须关闭写管道才能访问读管道。

请给我一些帮助。

【问题讨论】:

    标签: c++ fork pipe popen interactive


    【解决方案1】:

    您需要打开两个管道,一个连接到子进程的标准输入,一个连接到标准输出。您可能还需要一些方法在您的流程中多路复用输入/输出。

    另一种选择可能是使用伪终端,这将为您提供与具有伪终端作为 I/O 通道的客户端软件的双向通信 - 尽管我不太确定您执行的步骤通过这样做,我只是建议它,因为我知道其他程序,例如 xterm 和 ssh 使用该方法。

    之前有人问过同样的问题,答案与我在第一段中描述的差不多: popen simultaneous read and write (这个答案包括一些看起来不错的代码!)

    【讨论】:

    • 但是,如何为已经运行的进程重新连接标准输入或输出?我不知道如何做到这一点。使用 popen 您只能连接到标准输入或标准输出的“命令”。
    • 不,你不能这样做,但最初的问题是关于“popen”,它用管道打开一个进程。提问者必须用两个管道来复制它,这并不难。只需调用 pipe 和 dup2()。
    • 你有代码 sn-p 吗?我以前有过同样的问题,但无法解决。我无法使用两个用于标准输入和标准输出的管道连接到外部程序(更不用说标准错误 ;-))。我想,没那么容易……
    • 查看我的最新编辑,有一个指向之前提出的问题的链接,该问题已被接受并且有很多赞成票,所以我认为它是正确的。我没有尝试过这个特定的代码-sn-p,但我过去做过类似的事情[无法发布该代码,因为它是一个工作项目]
    • 我没试过,但看起来不错。感谢您的提示。这也是当前问题的答案,包括。代码。
    【解决方案2】:

    您将不得不使用特定于操作系统的工具来为 stdout 和 stdin(以及 stderr,如果您愿意)创建单独的管道。在 POSIX 平台上,您可以使用 dup2() 将适当的管道末端放置到标准输出和标准输入(以及标准错误)。在fork() 之后,您将不得不恢复原始描述符,所以不要忘记在放置新描述符之前保存它们。

    【讨论】:

      【解决方案3】:

      管道不是这样工作的。您只能使用读取或写入管道。

      另外,由于方向的原因,标准输入和输出不能是同一个端点。它来自“管道工作”。有人开始并将某些东西放到标准输出中,这些东西可以被其他人用作标准输入,然后又把它放在标准输出中作为第三个...

      对于双向通信,您需要找到另一种进程间通信方式。它是什么取决于您的实现。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-11
        • 1970-01-01
        • 2019-08-31
        • 2016-05-22
        • 2012-01-05
        • 1970-01-01
        相关资源
        最近更新 更多