2016-12-21 1 views
-2

Я работаю в простом проекте на моем малине pi, который размывает некоторые светодиоды различными способами на некоторых системных событиях (например, чтение диска, связь Ethernet, перегрузка процессора) и эти светодиоды должны быть отключены через некоторое время после того, как система простаивает (эти светодиоды будут изменять свою интенсивность, если не будет обнаружена активность sys).XOpenDisplay не работает при запуске с демона (язык C)

Чтобы достичь определения простоя, я использую XScreenSaver, пока здесь все не работает безупречно.

Как мой проект должен был исполняться как демон (etc/init.d) и должен был запускаться с правами root (потому что библиотека pigpio), связь с X Server (через XOpenDisplay) возвращает NULL каждый раз, даже когда система готова и в графическом интерфейсе. На терминале, запуская это вручную, все работает отлично.

Как я узнал, я понял, что невозможно получить доступ к X-серверу, когда во время загрузки нет консоли, и нет способа получить к ней доступ по соображениям безопасности.

поэтому я спрашиваю, как я мог бы достичь этого (определить время простоя) на простейшем пути? (я попробовал автозапуск, попробовал установку переменной DISPLAY в скрипте запуска, похоже, не работает.) Я новичок в разработке Linux и не могу понять, как правильно ее решить.

+0

Непонятно, в чем проблема. Но есть плохой запах XY-проблемы. – Olaf

+0

Мне нужно использовать XScreenSaverQueryInfo для проверки состояния системы IDLE, но я не могу заставить его работать с моим приложением как DAEMON. когда я начинаю его с терминала, его работы. – eduardogarcia234

+0

следующий код: xidle = XOpenDisplay (0); if (xidle) { \t XScreenSaverInfo * info = XScreenSaverAllocInfo(); \t XScreenSaverQueryInfo (xidle, DefaultRootWindow (xidle), info); \t ret = (info-> idle> 60000? (Info-> idle> 900000? 2: 1): 0); } – eduardogarcia234

ответ

0

Просто одетый мой собственный вопрос, если у кого есть такая же проблема, как и я.

Обнаружение неактивности системы (Idle) за пределами графического интерфейса X - это только вопрос активности USB-клавиатуры/мыши, отслеживая их IRQ (обычно IRQ 1/IRQ 12) на/proc/interrupt или более простой (поддерживающий другой USB-вход как и джойстики!) путем мониторинга/proc/stat на строке «softirq», второго числового столбца, который содержит числовое количество байтов, переданных, когда эти устройства имеют какой-либо/любой вход (перемещение мыши или нажатие/отключение мыши)

Это достигается легко в C по времени, fopen/fread на этих полях, сравнивая значения со старыми.

Большое спасибо моим интенсивным исследованиям по внутренним системам Linux & Пользователь Olaf, обладающий огромными знаниями по обнаружению очевидного.

Смежные вопросы