直接从无窗口 Linux 终端启动 OpenGL 应用程序

Posted

技术标签:

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

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


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

./visualdiagnostics

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


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

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

【问题讨论】:

【参考方案1】:

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

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

检测X是否在运行

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

    pgrep Xorg 检查/var/lib/gdm/:0.Xauth是否存在。即使没有人登录但 GDM 正在运行,它也会存在。 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 ? 如何安装它? Here 或 there

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

X 是否在服务器上运行?

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

  export DISPLAY=:0.0

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

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

【讨论】:

以上是关于直接从无窗口 Linux 终端启动 OpenGL 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

从无到有构建一个Mini Linux

从无到有构建一个Mini Linux

从无到有构建一个Mini Linux

用户界面

Linux常用指令

Linux常用指令