如何从 C++ 应用程序打开 osx 上的 xterm?

how to popen xterm on osx from c++ application?

我这样做:

popen("xterm -e ' some bash script ' ","r");

如果我从终端命令行启动我的应用程序,它工作正常。
但是如果我双击 finder 启动它(即非终端),应用程序运行,但 xterm 没有出现。

(xterm 在 osx 上可能不是正确的解决方案,我想做的是从 popen 打开一个终端,在终端内与用户交互,然后 return 结果这种与主程序的交互)

xterm 的 window(或可能的其他终端)中显示的输出不会被 popen 读取,因此该部分不清楚。但是,您说这适用于终端 window.

另一个问题是运行 xterm 所需的DISPLAY 变量可能没有在finder 为运行ning 的环境中设置。您可以通过向命令行添加合适的 -display 选项来解决 that 问题。例如,如果您的应用程序 运行 正在本地机器上显示(可能),您可以尝试

popen("xterm -display :0.0 -e ' some bash script ' ","r");

从 xterm 捕获输出时,需要考虑两种类型的输出:

  • 来自 xterm 本身的错误消息被写入标准错误
  • xterm 中的程序 运行ning,例如 'some bash script',将写入 xterm window.

对于您的示例,您可以通过将命令中的标准错误重定向到 xterm 的标准输出,直接从 popen 捕获管道中的错误消息,例如,

popen("xterm -display :0.0 -e ' some bash script ' 2>&1 ","r");

捕获 bash 脚本的输出更难。您可以重定向 bash 脚本本身的输出,例如

popen("xterm -display :0.0 -e ' some bash script >mylogfile ' ","r");

但这会干扰互动。更好的解决方案可能是使用 script 程序,执行如下操作:

popen("xterm -display :0.0 -e  script mylogfile ' some bash script ' ","r");