【发布时间】:2013-01-16 18:15:25
【问题描述】:
我需要执行一个外部程序并交替访问它的标准输入和标准输出,就像控制台终端本身一样。我使用了 popen(),但它不提供双向管道。使用 pipe() 和 fork() 也不能交互工作,因为必须关闭写管道才能访问读管道。
请给我一些帮助。
【问题讨论】:
标签: c++ fork pipe popen interactive
我需要执行一个外部程序并交替访问它的标准输入和标准输出,就像控制台终端本身一样。我使用了 popen(),但它不提供双向管道。使用 pipe() 和 fork() 也不能交互工作,因为必须关闭写管道才能访问读管道。
请给我一些帮助。
【问题讨论】:
标签: c++ fork pipe popen interactive
您需要打开两个管道,一个连接到子进程的标准输入,一个连接到标准输出。您可能还需要一些方法在您的流程中多路复用输入/输出。
另一种选择可能是使用伪终端,这将为您提供与具有伪终端作为 I/O 通道的客户端软件的双向通信 - 尽管我不太确定您执行的步骤通过这样做,我只是建议它,因为我知道其他程序,例如 xterm 和 ssh 使用该方法。
之前有人问过同样的问题,答案与我在第一段中描述的差不多: popen simultaneous read and write (这个答案包括一些看起来不错的代码!)
【讨论】:
您将不得不使用特定于操作系统的工具来为 stdout 和 stdin(以及 stderr,如果您愿意)创建单独的管道。在 POSIX 平台上,您可以使用 dup2() 将适当的管道末端放置到标准输出和标准输入(以及标准错误)。在fork() 之后,您将不得不恢复原始描述符,所以不要忘记在放置新描述符之前保存它们。
【讨论】:
管道不是这样工作的。您只能使用读取或写入管道。
另外,由于方向的原因,标准输入和输出不能是同一个端点。它来自“管道工作”。有人开始并将某些东西放到标准输出中,这些东西可以被其他人用作标准输入,然后又把它放在标准输出中作为第三个...
对于双向通信,您需要找到另一种进程间通信方式。它是什么取决于您的实现。
【讨论】: