首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >确定程序是Linux中的GUI还是控制台应用程序

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

Stack Overflow用户
提问于 2013-05-14 18:19:34
回答 2查看 1.6K关注 0票数 3

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

我看到了一些关于如何做这个窗口的信息,还有关于在Linux上(在精灵内部)不存在类似的(为了获胜)标识的信息。是否有其他方法在Linux上执行此操作?

我想:

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

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

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

最后结论:

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

可能会为找到的每个条目解析ldd的输出。

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-14 20:49:37

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

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

代码语言:javascript
复制
 #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
EN

Stack Overflow用户

发布于 2013-05-15 14:09:29

如果您正在编写(另一个)应用程序启动程序,请跟踪创建所有其他应用程序启动程序的人所做的,并使用 files。该规范已经定义了Terminal选项,这正是您要寻找的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16550112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档