无法从Linux TTY运行X11 C程序

问题描述

我正在学习C语言的X11编程。我编写了这个小代码,它只是创建了一个窗口:

var places = [{
  lat: 12.123,lng: 13.213,city: 'New York'
},{
  lat: 3.123,lng: 2.213,lng: 4.123,city: 'Some City'
}];
const getUniqueBy = (arr,prop) => {
  const set = new Set;
  return arr.filter(o => !set.has(o[prop]) && set.add(o[prop]));
};
console.log(getUniqueBy(places,'city'));

我有一台Linux PC(Ubuntu发行版),并安装了Gnome桌面环境。我已经成功编译并从Gnome的图形终端运行了程序。
据我所知,X11程序应该在没有桌面环境帮助的情况下运行。因此,我切换到了TTY( ALT + F3 ),并尝试从那里运行该程序。但显示“无法打开显示”。
阅读一些帖子后,我了解到我应该#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,1000,600,1,BlackPixel(display,WhitePixel(display,screen)); XSelectInput(display,win,ExposureMask | KeyPressMask); XMapWindow(display,win); while(1) { XNextEvent(display,&event); } return 0; } 。但是这样做之后,该程序将在现有Gnome桌面内而不是当前TTY上创建窗口。
这个问题可能看起来很愚蠢。我想知道如何在不运行任何桌面环境的情况下直接从TTY运行此程序。

解决方法

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

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

您也可以启动另一个X11。尽管您可能必须设置一些命令行参数,但这实际上很简单。但是,我认为这不是主题,因为它不是编程问题,而是Linux问题。

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

在最新版本的Linux中,X11实际上使用帧缓冲设备,因此,理论上您可以通过X11可以完成的所有帧缓冲设备来完成所有工作。它使用了更多的功能来访问图形卡等等。关键字是“内核模式设置”(KMS)和“直接渲染基础结构”(DRI)。据我所知,除了X11服务器和Wayland(类似于设计不同的X11服务器)外,没有其他程序使用这些程序。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...