如何以编程方式(C/C++)验证是否启用了X11转发?

csga3l58  于 2023-03-20  发布在  C/C++
关注(0)|答案(2)|浏览(143)

应用程序在目标硬件上远程运行。用户可以选择启用可视化调试输出(使用命令行开关),在这种情况下,使用ssh的X11转发来查看它。
如果用户忘记在运行应用程序之前建立连接,则会出现问题,如下所示:ssh -YC remote.host。应用程序将崩溃。
我想提前检测这种情况,并在启动应用程序时打印适当的消息。在C/C++中可以这样做吗?在最坏的情况下,我可以在后台执行一些shell命令。

vi4fp9gy

vi4fp9gy1#

如果你有一个X11显示器(真实的或者通过ssh转发的),你就有一个DISPLAY环境变量,否则它就不应该存在。
侵入性最小的检查可能是:

if (!getenv("DISPLAY")) {
    fprintf(stderr, "missing X11 display, have you forgotten something?\n");
    exit(1);
}

如果有人忘记了在ssh中转发X,这应该会触发。

p3rjfoxz

p3rjfoxz2#

您可以使用XOpenDisplay man page

#include <X11/Xlib.h>
#include <cstdlib>
#include <iostream>

bool displayIsValid()
{
    char* disp = getenv("DISPLAY");
    if ( disp==nullptr ) return false;
    Display* dpy = XOpenDisplay(disp);  
    if ( dpy==nullptr ) return false;
    XCloseDisplay(dpy);
    return true;
}

int main() {
    if ( displayIsValid() ) {
        std::cout << "Display is valid" << std::endl;
    }
}

相关问题