确定程序是Linux中的GUI还是控制台应用程序

时间:2013-05-14 18:19:35

标签: c++ linux qt user-interface x11

我使用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的输出。

感谢。

2 个答案:

答案 0 :(得分: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。更精细的方法是调用XOpenDisplay,在失败时返回NULL(并且有几个X11工具包可以这样做)。

所以,你的问题没有一个确切的答案,并没有真正的意义。

您可以使用ldd ....并手动添加firefox等个人例外。

答案 1 :(得分:1)

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