4

我正在尝试构建一个如果使用 shell 或从 GUI 运行会以不同方式运行的类。

它可以使用#include“myclass.h”包含在两种形式中......

但是,在构造函数中,我想区分 Shell 运行和 GUI 运行。

我可以使用在声明它时传递给构造函数的参数轻松实现它,但我想探索我的选项。

我在 ubuntu 上使用 C++,我的 GUI 使用 Qt。

4

2 回答 2

8

确定 X Window 是否存在的标准 C 方法:

#include <stdlib.h>

if (NULL == getenv("DISPLAY")) is_gui_present = false;
else is_gui_present = true;
  • 这允许区分终端仿真器和纯 tty 启动中的伪终端。

如果您想确定是否有 shell,或者应用程序是从文件管理器运行的,那么这并不容易:这两种情况都只是exec从 shell 或文件管理器/GUI 程序运行器调用系统调用(通常使用相同的参数),您需要显式传递一个标志才能看到。

PS我刚刚找到了一种方法:检查变量“TERM”的环境-它是为shell设置的并且继承给Qt程序,它通常不在GUI程序中设置。但是不要把它当作一个准确的解决方案!

于 2012-11-02T23:06:00.420 回答
6

从桌面启动程序(双击或从桌面文件/开始菜单)通常会将其标准输入文件描述符重定向到管道。您可以检测到这一点:

#include <cstdio>    // fileno()
#include <unistd.h>  // isatty()

if (isatty(fileno(stdin)))
    // We were launched from the command line.
else
    // We were launched from inside the desktop
于 2012-11-02T23:23:25.693 回答