直接从无窗口 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,或者如果您想以已登录的同一用户身份运行应用程序,这很容易。
您必须正确设置 DISPLAY
和 XAUTHORITY
环境变量,然后您就可以使用现有的 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 stop
。 killall Xorg
也可以。
如果您是用户,请终止您自己的 Xorg
或 x-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 应用程序的主要内容,如果未能解决你的问题,请参考以下文章