C ++中的交互式管道

时间:2013-02-01 12:21:32

标签: c++ fork pipe popen interactive

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

请给我一些帮助来提出它。

3 个答案:

答案 0 :(得分:4)

您需要打开两个管道,一个连接到子进程的stdin,一个连接到stdout。您可能还需要一些方法来在您的过程中复用输入/输出。

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

之前已经问过同样的问题,答案几乎就是我在第一段中所描述的: popen simultaneous read and write (这个答案包括一些看起来不错的代码!)

答案 1 :(得分:1)

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

答案 2 :(得分:0)

管道不起作用。您只能使用读取或写入管道。

此外,由于方向的原因,标准输入和输出不能是相同的终点。它来自"管道工作"。有人开始并将某些内容放到stdout上,这可以被其他人用作标准输入,并再次将其用于第三个标准输出......

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