【问题标题】:Launch OpenGL app straight from a windowless Linux Terminal直接从无窗口 Linux 终端启动 OpenGL 应用程序
【发布时间】:2009-10-11 23:06:14
【问题描述】:

究竟如何让 OpenGL 应用程序直接从终端(Ubuntu Server 9.04)全屏运行?我在我的服务器上开发了一个可视化诊断应用程序,但我不完全确定让它在无窗口环境中运行的最佳方法。


理想情况下,我会运行我的程序:

./visualdiagnostics

然后启动 OpenGL 应用程序。然后,通过一个简单的Ctrl+X 键绑定,我将终止应用程序并返回终端。


我是否需要安装 X11,然后以某种方式从程序中启动它?检测它是否已经运行并在必要时启动/停止它的最佳方法是什么?

仅供参考:不,我不是试图让它在 Putty 或任何东西上运行...我有一个监视器直接连接到服务器。服务器已安装正确的视频驱动程序。

【问题讨论】:

    标签: c linux opengl


    【解决方案1】:

    您的任务有几个部分。请记住,其中一些可能是特定于发行版的;但是既然你说的是 Ubuntu,我们就说 Ubuntu!

    您还标记了这个问题 C 但是我从一个常见的 Linux 模式开始:一个带有 Bash shell 脚本包装器的本机应用程序。也许一旦你把事情做好了,如果你必须的话,你可能会将该功能折叠到 C 中。

    检测X是否在运行

    成为 root 可以帮助很多。一些有用的东西。

    1. pgrep Xorg
    2. 检查/var/lib/gdm/:0.Xauth是否存在。即使没有人登录但 GDM 正在运行,它也会存在。
    3. ls -l /home/*/.Xauthority(即使您不是 root,您至少可以确认 是否正在运行 X。

    捎带现有的 X 会话

    您没有特别提到它,但如果您是控制台的 root,或者如果您想以已登录的同一用户身份运行应用程序,这很容易。

    您必须正确设置 DISPLAYXAUTHORITY 环境变量,然后您就可以使用现有的 X 显示器。

    对于DISPLAY,您可能只是假设:0,或者您可以找到一个现有的X 程序(x-session-manager 是GNOME 标准)并从/proc/PID/environ 读取它的环境。变量采用由空字节分隔的 key=value 格式。例如,如果它的PID是12345:

    cat /proc/12345/environ \
      | ruby -ne 'puts $_.split("\0").select {|e| e.starts_with? "DISPLAY=" }'
    

    对于XAUTHORITY,您可以通过相同的方式获得它。或者如果你更喜欢猜测,它几乎总是/home/whoever/.Xauthority

    一旦有了这两个变量,运行 X 代码就很容易了,例如:

    env DISPLAY=:0 XAUTHORITY=/home/brian/.Xauthority ./visualdiagnostics
    

    停止 X

    如果您是 root,这很容易:/etc/init.d/gdm stopkillall Xorg 也可以。

    如果您是用户,请终止您自己的 Xorgx-session-manager 进程。 (我欢迎其他人提供有关执行此操作的规范方法的意见。也许是一些 dbus-send 消息?)

    开始 X

    我会推荐xinit,他的人生目标是触发 X 并运行一个程序。

    例如:xinit ./visualdiagnostics

    您还可以告诉 xinit 以什么分辨率运行 X,这可能对您很重要,也可能不重要。 (这在下面的全屏部分变得很重要。)

    这样做的问题是您将没有窗口管理器——没有最大化和最小化按钮。这不仅仅是化妆品。通常一个应用程序是无用的,因为弹出窗口无法移动,或者您无法专注于正确的输入字段。但是,如果您有一个特殊的应用程序就足够了(请参阅下面的全屏)。

    下一步将是我对所有问题的回答:另一个 shell 脚本包装器!启动窗口管理器然后成为您的程序的简单方法应该可以工作。

    #!/bin/bash
    #
    # Start visualdiagnostics once xinit calls me.
    
    /usr/bin/metacity& # Or ratpoison, or fluxbox, or compiz, etc.
    exec ./visualdiagnostics
    

    执行(成为)主程序很重要,因为一旦第一个程序退出,X 将关闭。

    全屏运行

    我对此不是 100% 确定的。一些想法:

    • 尝试使用标准 X -geometry 参数将 0,0 设置为左​​上角,将 +x+y 设置为水平和垂直大小。你怎么知道大小?您可以在启动xinit 时对其进行硬编码,或者您可以询问X 服务器。 xwininfo -root 会告诉您,并且有一个 xlib API 调用也可以做到这一点——我猜请检查 xwininfo 源。
    • 您的应用程序本身可以请求最大化和/或调整大小以填满屏幕。我不熟悉,但肯定是在 X API 中。
    • 可以预先配置一些更可配置的窗口管理器以最大化运行您。这可能是我个人首先要检查的。您的包装脚本可以通过回显一些硬编码的配置 > 文件来创建 $HOME/.fluxboxrc

    总结

    其他人是对的。 X 不是绝对必要的,因为 OpenGL 可以针对帧缓冲区运行。然而,考虑到 X 的普遍性以及在分发自动化方面投入了多少工作,我可能会将我的精力投入到 X 路线上,因为从长远来看它可能会更容易,即使它有点复杂。

    (顺便说一句,我真诚地希望当你说“终端”时,你的意思是你在文本 console,而不是 gnome-terminal 那太糟糕了!:)

    【讨论】:

    • 您先生,是我的英雄。完美而美丽的答案。是的,我的意思是“控制台”而不是“gnome-terminal”:P 感谢您花时间写出如此出色的回复。
    • 不客气!说实话,我已经从以前的项目中知道了大部分内容。我想这就是这个网站的好处!
    【解决方案2】:

    好吧,我显然不确定我的回答是否能帮到你。

    很久以前,当我还是学生时,我通过安装帧缓冲区来做到这一点(从仅限终端的 linux 安装启动 openGL 应用程序)。只要我记得我需要重新编译我的内核(因为帧缓冲区是/是一个内核模块)。

    这可能是 5 年前在一个 debian 发行版上,我不知道它现在如何作为 Ubuntu 的最新 debian 发行版工作。也许framebuffer是在Ubuntu默认提供的二进制内核中静态编译的。也许不吧。也许帧缓冲区现在无关紧要......或者我可能完全错了,现在不记得我自己 5 年前冒险的每一个细节......

    在谷歌上看看! ;-)

    希望对你有帮助……

    **

    更新:

    **
    What is frame buffer ?
    如何安装它? Herethere

    【讨论】:

      【解决方案3】:

      正如 yves 所指出的,如果使用帧缓冲区,则可以避免运行 X 服务器。实际上,framebuffer 模块通常还可用(例如,它们用于在内核启动期间使用 tux 徽标或在背景中有精美图像的文本终端),这无论如何取决于您使用的分发和设置。

      内核方面非常原始,所以我建议使用一些更高级别的库,例如DirectFB。帧缓冲区可以毫无问题地使用,但不要期望与成熟的 X 服务器具有相同的成熟度。

      【讨论】:

        【解决方案4】:

        您是否尝试将视频显示在直接连接到计算机的显示器上?

        X 是否在服务器上运行?

        如果 X 正在运行,你可以这样做

          export DISPLAY=:0.0
        

        它告诉 X 应用程序连接到本地主机上的 X 服务器,而不是你来自哪里。

        如果您实际上是在本地登录(从直接终端)...是的,您需要安装并运行 X。

        【讨论】:

          猜你喜欢
          • 2011-04-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-25
          • 1970-01-01
          相关资源
          最近更新 更多