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

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

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

我想到:

  • 使用QProcess生成每个条目,并监视它的生命周期,假设控制台应用程序需要一些input,而且我没有提供任何input,它会打印出一个帮助消息并退出。 如果它在x秒后还活着,我会杀死这个进程并将其标记为包含gui。 这是一个可怕的方法,容易出错;
  • 运行ldd并parsing任何libX的输出。 这似乎是一个更好的办法,虽然firefox,例如,将不能被标记为有gui。

编辑0:这个项目是一个应用程序启动器

编辑1:一旦我有分类的程序列表,我可以启动一个terminal模拟器,每当用户select一个非graphics化的应用程序

定论:

在人们回答和额外search之后,真正无法可靠地辨别控制台和gui应用程序。 我最好的办法是做一些考虑,比如search.desktop文件,做一些假设,比如/ bin,/ sbin和/ usr / sbin等。

也许为每个find的条目parsingldd的输出。

谢谢。

一个程序可以尝试作为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异常。

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