我需要执行一个外部程序并交替访问它的stdin和stdout,就像控制台终端本身一样。我使用过popen(),但它没有提供双向管道。使用pipe()和fork()也不能以交互方式工作,因为必须关闭写管道才能访问读管道。
请给我一些帮助来提出它。
答案 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上,这可以被其他人用作标准输入,并再次将其用于第三个标准输出......
对于双向通信,您需要找到另一种进程间通信方式。它取决于你的实施。