无法 运行 来自 Linux TTY 的 X11 C 程序

Cannot run X11 C program from Linux TTY

我正在学习用 C 语言进行 X11 编程。我编写了这个小代码,它只创建了一个 window:

#include<stdio.h>
#include<stdlib.h>
#include<X11/Xlib.h>

int main(int argc, char *argv[]) {
    Display *display;
    int screen;
    Window win;
    XEvent event;

    display = XOpenDisplay((char*)0);
    if(display == NULL) {
        fprintf(stderr, "Cannot open display\n");
        exit(1);
    }
    screen = DefaultScreen(display);
    win=XCreateSimpleWindow(display, RootWindow(display, screen), 100, 100, 1000, 600, 1, BlackPixel(display, screen), WhitePixel(display, screen));
    XSelectInput(display, win, ExposureMask | KeyPressMask);
    XMapWindow(display, win);
    
    while(1) {
        XNextEvent(display, &event);
    }

    return 0;
}

我有一台 Linux PC(Ubuntu 发行版)并安装了 Gnome 桌面环境。我已经从 Gnome 的图形终端成功编译并拥有 运行 程序。
据我所知,X11 程序应该 运行 没有桌面环境的帮助。因此,我切换到 TTY (ALT+F3) 并尝试从那里 运行 程序。但是它说“无法打开显示”。
看了一些帖子后,我知道我应该做 export DISPLAY=:0。但是在这样做之后,程序会在现有的 Gnome 桌面而不是当前的 TTY 上创建 window。
这个问题可能看起来很愚蠢。我想知道如何在没有任何桌面环境的情况下直接从 TTY 运行 这个程序 运行ning。

没有 X11 就不能 运行 X11 程序。您的计算机已经 运行 连接了一个 X11 实例(称为显示器),并且您的桌面环境已连接到它,这就是它显示所有桌面内容的方式。

桌面环境中 运行 的所有内容都有一个环境变量集,称为 DISPLAY,它告诉它要连接到哪个 X11 显示器(实例)。在不同的 TTY 中,尚未设置。如果您将它设置为与您的桌面程序相同的值,那么您可以 运行 X11 程序将连接到该显示器。

你也可以启动另一个X11。它实际上非常简单,尽管您可能需要设置一些 command-line 参数。但是,我认为这里是 off-topic,因为它不是编程问题而是 Linux 问题。

根据您的内核配置,您或许可以使用帧缓冲设备 (fbdev) 直接在屏幕上绘图。它是一个独立于 X11 的系统,它对简单图形最有用(即直接在屏幕上绘制像素)。如果您想知道如何使用 fbdev,那应该是一个单独的问题。

在最近的Linux版本中,X11实际上使用了framebuffer设备,所以理论上你可以通过framebuffer设备做X11能做的一切。它使用了更多的功能来启用对图形卡等的访问。关键字是“内核模式设置”(KMS) 和“直接渲染基础结构”(DRI)。据我所知,除了 X11 服务器和 Wayland(就像设计不同的 X11 服务器)之外,没有其他程序使用这些。