【问题标题】:how to popen xterm on osx from c++ application?如何从 c++ 应用程序在 osx 上打开 xterm?
【发布时间】:2015-04-13 08:39:35
【问题描述】:

我这样做:

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

如果我从终端命令行启动我的应用程序,它可以正常工作。
但是如果我在查找器中双击以启动它(即非终端),应用程序会运行,但 xterm 不会出现。

(xterm在osx上可能不是正确的解决方案,我要做的是从popen打开一个终端,在终端内与用户交互,并将交互结果返回给主程序)

【问题讨论】:

  • 它是什么类型的应用程序?命令行还是 Cocoa?
  • 这是一个使用 glut 的 X11 应用程序。

标签: c++ c macos console xterm


【解决方案1】:

popen 不会读取 xterm 窗口(或可能的其他终端)中显示的输出,因此该部分不清楚。但是,您说这可以在终端窗口中使用。

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

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

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

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

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

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");

【讨论】:

  • -display :0.0 不会改变任何东西。你是对的,popen 不会从 xterm 发回东西,我会写一个临时文件来取回东西。或者我可以尝试将 xterm 输出重定向到 popen &2。
猜你喜欢
  • 1970-01-01
  • 2020-09-04
  • 1970-01-01
  • 2020-05-04
  • 2012-05-01
  • 1970-01-01
  • 2013-01-09
  • 2010-11-27
  • 1970-01-01
相关资源
最近更新 更多