Ваша задача состоит из нескольких частей. Имейте в виду, что некоторые из них могут быть очень специфичными для дистрибутива; но поскольку вы сказали Ubuntu, мы поговорим об Ubuntu!
Также вы отметили этот вопрос C, однако я начинаю с общего шаблона Linux: нативное приложение с оболочкой сценария оболочки Bash. Возможно, как только вы добьетесь хорошей работы, вы сможете при необходимости вложить эту функциональность в C.
Право root может очень помочь. Некоторые вещи, которые работают.
pgrep Xorg
/var/lib/gdm/:0.Xauth
. Это будет там, даже если никто не вошел в систему, но GDM работает. ls -l /home/*/.Xauthority
(Даже если вы не root, вы можете по крайней мере подтвердить, вы работают под управлением X. Вы не упомянули об этом специально, но если вы являетесь пользователем root на консоли или хотите запустить приложение от имени того же пользователя, который уже вошел в систему, это довольно просто.
] Вы должны правильно указать переменные среды DISPLAY
и XAUTHORITY
, и как только вы это сделаете, вы можете использовать существующий дисплей X.
Для DISPLAY
вы можете просто предположите : 0
или вы можете найти существующую программу X ( x-session-manager
является стандартом GNOME) и прочитать ее среду из / proc / PID / Environment. Переменные имеют формат "ключ = значение" и разделены нулевым байтом. Например, если его 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
Это легко, если вы root: /etc/init.d/gdm stop
. killall Xorg
тоже будет работать.
Если вы пользователь, убейте свой собственный процесс Xorg
или x-session-manager
. (Я хотел бы получить информацию от других о каноническом способе сделать это. Может быть, какое-нибудь сообщение dbus-send?)
Я бы порекомендовал xinit
, чья цель в жизни - запустить X и запустить ровно одну программу.
Например: xinit ./visualdiagnostics
Вы также можете указать xinit, с каким разрешением запускать X, что может быть важно или не важно для вас. (Это становится важным в полноэкранном разделе ниже. )
Проблема в том, что у вас не будет оконного менеджера - кнопок развертывания и свертывания. Это не просто косметика. Обычно приложение бесполезно, потому что всплывающее окно нельзя переместить или вы не можете сфокусироваться на правом поле ввода. Однако, если у вас есть специальное приложение, этого может быть достаточно (см. Полноэкранный режим ниже).
Следующим шагом будет мой ответ на все: еще одна оболочка сценария оболочки ! Что-то простое, запускающее оконный менеджер, а затем превращающееся в вашу программу, должно работать.
#!/bin/bash
#
# Start visualdiagnostics once xinit calls me.
/usr/bin/metacity& # Or ratpoison, or fluxbox, or compiz, etc.
exec ./visualdiagnostics
Важно, чтобы exec (стала) главной программой, потому что как только эта первая программа завершится, X отключится.
Я работаю не уверен на 100% в этом. Некоторые идеи:
-geometry
, чтобы установить 0,0 в качестве верхнего левого угла и + x + y для горизонтального и вертикального размера. Как узнать размер? Либо вы жестко запрограммировали его при запуске xinit
, либо можете запросить X-сервер. xwininfo -root
сообщит вам, и есть вызов API xlib, который тоже сделает это - я думаю, проверьте источник xwininfo. $ HOME / .fluxboxrc
, просто повторив некоторые жестко запрограммированные конфигурации> файла. Остальные правы. X не является строго обязательным, поскольку OpenGL может работать с фреймбуфером.
Well I am clearly not sure my answer might help you out.
Long ago when I was student, I manage to do so (launching an openGL app from a terminal only linux installation) by installing frame buffer. As long as I remember I needed to recompile my kernel (as framebuffer was/is a kernel module).
This was maybe 5 years ago on a debian distrib, and I don't know how does it work now for up-to-date debian distrib as Ubuntu. Maybe framebuffer is compiled statically in the binary kernel provided by default with Ubuntu. May be not. Maybe framebuffer is irrelevant now... Or I may be totally wrong and not remembering every details of my own adventure 5 years ago now ..
Have a look on Google ! ;-)
Hope it will help...
**
**
What is frame buffer ?
How to install it? Here or there
As yves pointed out, you can avoid running the X server if you use the framebuffer. Actually, the framebuffer modules are often yet available (for example, they are used to have the tux logo during the kernel start or a text terminal with fancy images in the background), this anyway depends on the distribution and the settings you are using.
The kernel side is quite primitive so I'd suggest to use some higher level library such as DirectFB. The framebuffer is usable without problems but don't expect the same maturity level than a full blown X server.
Are you trying to have the video be on the monitor connected directly to the computer?
Is X running on the server?
If X is running, you can do
export DISPLAY=:0.0
which tells X apps to connect to the X server at localhost, rather than where' you're coming from.
If you're actually logging in locally (from a direct terminal) ... yes, you need X installed and running.