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


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


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

./visualdiagnostics

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


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

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


7444
2017-10-11 23:06


起源



答案:


您的任务有几个部分。请记住,其中一些可能非常特定于发行版;但既然你说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用户,或者如果您想以已登录的同一用户身份运行应用程序,则非常简单。

你必须得到 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 stopkillall 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路线,因为它可能更容易长期,即使它有点复杂。

(顺便说一句,我 真心希望 当你说“终端”时你的意思是你在文本 安慰不是 侏儒末端 那太糟糕了! :)


12
2017-10-16 17:48



先生,是我的英雄。完美而美丽的答案。是的,我的意思是“控制台”而不是“gnome-terminal”:P感谢您花时间写出如此出色的回复。 - brianreavis
非常欢迎你!说实话,我已经从以前的项目中了解了大部分内容。我猜这是这个网站的好处! - JasonSmith


答案:


您的任务有几个部分。请记住,其中一些可能非常特定于发行版;但既然你说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用户,或者如果您想以已登录的同一用户身份运行应用程序,则非常简单。

你必须得到 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 stopkillall 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路线,因为它可能更容易长期,即使它有点复杂。

(顺便说一句,我 真心希望 当你说“终端”时你的意思是你在文本 安慰不是 侏儒末端 那太糟糕了! :)


12
2017-10-16 17:48



先生,是我的英雄。完美而美丽的答案。是的,我的意思是“控制台”而不是“gnome-terminal”:P感谢您花时间写出如此出色的回复。 - brianreavis
非常欢迎你!说实话,我已经从以前的项目中了解了大部分内容。我猜这是这个网站的好处! - JasonSmith


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

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

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

看看谷歌吧! ;-)

希望它会有所帮助......

**

更新:

**
什么是帧缓冲?
怎么安装呢? 这里 要么 那里


2
2017-10-12 00:31





正如yves指出的那样,如果你使用帧缓冲,你可以避免运行X服务器。实际上,帧缓冲模块通常是可用的(例如,它们用于在内核启动时具有tux徽标或在背景中具有花哨图像的文本终端),这无论如何取决于您使用的分布和设置。

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


1
2017-10-12 00:48





您是否尝试将视频直接连接到计算机上?

X是否在服务器上运行?

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

  export DISPLAY=:0.0

它告诉X应用程序连接到localhost上的X服务器,而不是“你来自哪里”。

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


0
2017-10-11 23:44