3

我正在使用 Qt-4 作为框架在 C++ 中编程,给定一个目录(即 /usr/bin),我想知道该程序是 GUI 还是控制台应用程序。

我遇到了一些有关如何执行此窗口的信息,以及关于 Linux(在 elf 内)上不存在类似(与 Win)标识的信息。有没有其他方法可以在 Linux 上执行此操作?

我想了想:

  • 使用 QProcess 生成每个条目并监视它的生命周期,假设控制台应用程序需要一些输入并且由于我没有提供任何输入,因此它将打印以显示帮助消息并退出。如果它在 x 秒后还活着,我会终止该进程并将其标记为包含 gui。这是一种可怕的方法并且容易出错;
  • 运行 ldd 并解析任何 libX 的输出或其他。这似乎是一种更好的方法,尽管例如 firefox 不会被标记为具有 gui。

EDIT0:这个项目是一个应用程序启动器

EDIT1:一旦我对程序列表进行了分类,我就可以在用户选择非图形应用程序时启动终端仿真器

定论:

在人们回答和额外搜索之后,确实不可能可靠地区分控制台和 gui 应用程序。我最好的选择是做一些考虑,比如搜索 .desktop 文件,做一些假设,比如在 /bin、/sbin 和 /usr/sbin 等仅实用程序的地方列出的工具等。

也许为找到的每个条目解析 ldd 的输出。

谢谢。

4

2 回答 2

2

如果您正在编写(又一个)应用程序启动器,请按照创建所有其他应用程序启动器的人所做的操作并使用.desktop文件。该规范已经定义了Terminal您正在寻找的选项。

于 2013-05-15T14:09:29.853 回答
1

程序可以尝试作为 GUI 程序启动,然后切换到控制台。(实际上有些程序确实表现出这种行为,例如emacs)。它甚至可以随机执行此操作,或者由于某些特定配置...

例如,假设vi是一个控制台程序和emacs一个图形程序,下面的简单程序可能随机是GUI或控制台:

 #include <unistd.h>

 int main(int argc, char**argv) {
    if (getpid()%2 == 0)
      { argv[0]="vi"; execv("/usr/bin/vi", argv); }
    else
      { argv[0]="emacs"; execv("/usr/bin/emacs", argv); }
    return EXIT_FAILURE;
 }

最简单(但不是万无一失)的方法是测试是否getenv("DISPLAY")返回 NULL。一种更复杂的方法是调用XOpenDisplaywhich 返回NULL失败(并且有几个 X11 工具包会这样做)。

所以,你的问题没有准确的答案,也没有真正的意义。

您可以使用ldd.... 并手动添加异常,例如firefox.

于 2013-05-14T20:49:37.090 回答