LINUX.ORG.RU

Демон и X Windows


0

0

Здравтсвуйте!
Я написал демон, который в своей работе использеут функции XLib.
Но с ним происходит что-то непонятное:
1. Я запускаю его из консоли. Он исправно выполняет свои функции. Я закрываю консоль, открываю ее снова - демон может присутствовать в списке процессов, а может и нет (когда как). По моим соображениям, его падение происходит на функции XGetNextEvent().
2. Я запускаю демон из системных скриптов при старте системы. Функция XOpenDisplay() возвращает NULL. Это присходит, даже если в теле демона поставить задержку, достаточную, чтобы дальнейшее выполнение продолжилось после захода вользователя в систему.
Кто-нибудь может это прокомментировать?


Ответ на: комментарий от Svoloch

В функцию XOpenDisplay() я передаю NULL. Но я пробовал передавать и ":0". Не помогает.
У меня уже есть программы, которые используют XOpenDisplay() с такими же параметрами, и они работают (соединение устанавливается). Правда, они не являются демонами.

pavelp
() автор топика
Ответ на: комментарий от cvv

Где и как правильно выставить HOME и где и как правильно указать Display?

pavelp
() автор топика

X Server устанавливает переменную окружения DISPLAY, и все дочерние процессы, вроде эмулятора терминала и демона, запускаемого из этого эмулятора наследуют её. Если демон не дочерний процесс X Server-а, у него нет никакой переменной DISPLAY, поэтому его надо указывать руками (например в конфиге). Так же стОит погуглить по xauth.

Legioner ★★★★★
()

>Я запускаю его из консоли.

а он может писать что-либо на консоль? если он пишет на закрытую консоль, то получает SIGPIPE и (по умолчанию) убивается. попробуй запускать как

prog > /dev/null 2>&1 < /dev/null

generatorglukoff ★★
()
Ответ на: быdло от anonymous

Явное указание "localhost:0" помогло при страте демона при запуске системы, а при запуске из консоли все осталось так же.
Но появилась новая проблема - после подключения к дисплею ничего невозможно записать в лог функцией syslog().

pavelp
() автор топика
Ответ на: комментарий от generatorglukoff

После открытия дисплея не работает ни syslog(), ни fprintf(). В чем может быть дело? Почему так происходит именно после открытия дисплея?

pavelp
() автор топика

> Я написал демон, который в своей работе использеут функции XLib.

Это в корне неправильно.

> даже если в теле демона поставить задержку, достаточную, чтобы дальнейшее выполнение продолжилось после захода вользователя в систему.

А если пользователь вообще не входит в систему?

> Кто-нибудь может это прокомментировать?

По хорошему, надо отослать тебя к первоисточникам -- описанию архитектуры X-Window System вообще.

Вкратце -- помимо адреса сервера (то, что в DiSPLAY) есть еще аутентификация, чтобы к X-серверу подключались только те, кому можно. Помимо одного единственного пользователя и одного единственного X-сервера могут быть и другие пользователи, и множество запущенных X-серверов, которые, в общем случае, связаны как многие-ко-многим.

В общем, если возникает задача показывать что-то пользователю на экране из демона, то надо предоставить возможность запуска скрипта с правами пользователя, который уже сам и разберется, что к чему.

watashiwa_daredeska ★★★★
()
Ответ на: комментарий от Legioner

> X Server устанавливает переменную окружения DISPLAY

X Server ее не устанавливает и у него, как правило, нет дочерних процессов.

watashiwa_daredeska ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.