【问题标题】:Invalid X server connection specified指定的 X 服务器连接无效
【发布时间】:2015-07-10 18:28:46
【问题描述】:

我在 Ubuntu 中运行 IDEA:sudo ./idea.sh
我使用库 LWJGL 编写了一个应用程序。当我运行项目时,发现一个错误窗口:

Exception in thread "main" java.lang.IllegalStateException: Invalid X server connection specified.
at org.lwjgl.system.linux.opengl.LinuxGLContext.createFromCurrent(LinuxGLContext.java:68)
at org.lwjgl.system.linux.opengl.LinuxGLContext.createFromCurrent(LinuxGLContext.java:63)
at org.lwjgl.opengl.GLContext.createFromCurrent(GLContext.java:41)
at core.Core.createWindow(Core.java:160)
at core.Core.main(Core.java:58)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)

Core.java,创建窗口:

if (glfwInit() != GL_TRUE) System.out.println("#0: Failed to create window");
    window = glfwCreateWindow(Settings.getWidth(), Settings.getHeight(), "Look", GL_NONE, GL_NONE);
    if (window == GL_NONE) System.out.println("#1: Failed to create window");
    glfwMakeContextCurrent(window);
    glfwShowWindow(window);

    ByteBuffer vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor());
    glfwSetWindowPos(window,
            (GLFWvidmode.width(vidmode) - Settings.getWidth()) / 2,
            (GLFWvidmode.height(vidmode) - Settings.getHeight()) / 2);
    GLContext.createFromCurrent(); // String №160
    glfwSwapInterval(1);

【问题讨论】:

    标签: linux opengl lwjgl nvidia


    【解决方案1】:

    首先要做的事情:您为什么要尝试以超级用户权限运行图形应用程序?这通常是个坏主意。


    X11 实现了各种身份验证机制,以防止不属于登录会话的用户访问 X 服务器。这不是通过 Unix 文件权限实现的,而是通过协议身份验证实现的。因此,即使您是 root,您也无法与 X 服务器对话,而无需跳过几圈。特别是每个客户端都需要访问 Xauthority cookie。这些默认情况下存储在${HOME}/.Xauthority 中,但可以使用XAUTHORITY环境变量定义为从不同位置获取。

    因此,要通过 sudo 传递它,您需要将 XAUTHORITY 设置为指向您的登录会话用户的 ~/.Xauthority,然后使用环境保留选项调用 sudo。

    export XAUTHORITY="${HOME}/.Xauthority"
    sudo -E ./idea.sh
    

    或者你可以在 sudo 之后设置 XAUTHORITY 环境。另一个更直接的选择是简单地在身份验证中打一个洞,允许所有本地运行的客户端访问 X 服务器。然而,这是一个坏主意,因为您系统上的 每个 用户可能会运行键盘记录器或以其他方式干扰您的会话(例如阻止屏幕锁定器工作)。你可以用xhost +si:localuser 打那个洞,但你真的不应该这样做。

    【讨论】:

      猜你喜欢
      • 2017-04-15
      • 2019-04-20
      • 2012-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-14
      相关资源
      最近更新 更多