2016-12-21 5 views
-2

Ich arbeite in einem einfachen Projekt auf meinem Raspberry Pi, die einige LEDs auf verschiedene Systemereignisse (wie Diskettenlesen, Ethernet-Kommunikation, Prozessorüberlastung) und Diese LEDs müssen einige Zeit ausgeschaltet werden, nachdem das System inaktiv ist (diese LEDs verhalten sich unterschiedlich, wenn keine sys-Aktivität erkannt wird).XOpenDisplay schlägt fehl, wenn es vom Daemon (Sprache C) ausgeführt wird

Um Leerlauferkennung zu erreichen, verwende ich XScreenSaver, bis hier alles einwandfrei funktioniert.

Da mein Projekt als Daemon (etc/init.d) ausgeführt werden musste und mit root-Rechten ausgeführt werden musste (wegen der figpio-Bibliothek), gibt die Kommunikation mit X Server (über XOpenDisplay) jedesmal NULL zurück, auch wenn System ist bereit und in der grafischen Benutzeroberfläche. Am Terminal läuft das manuell, alles funktioniert einwandfrei.

Ich habe verstanden, dass es nicht möglich ist, auf X Server zuzugreifen, wenn zum Zeitpunkt des Systemstarts keine Konsole verfügbar ist und es aus Sicherheitsgründen nicht möglich ist, darauf zuzugreifen.

Also frage ich, wie ich das auf einfachste Weise (Leerlaufzeit erkennen) erreichen könnte? (Ich versuchte Selbst-Neustart, versuchte Einstellung DISPLAY Variable auf Start-Skript scheint nichts zu funktionieren.) Ich bin neu auf Linux-Entwicklung und kann nicht herausfinden, wie dies richtig zu lösen.

+0

Nicht klar, was Ihr Problem ist. Aber es riecht schlecht nach einem XY-Problem. – Olaf

+0

Ich muss XScreenSaverQueryInfo verwenden, um den System IDLE-Status zu überprüfen, aber ich kann es nicht zum Laufen bringen, meine App als DAEMON zu starten. Wenn ich es vom Terminal aus starte, funktioniert es. – eduardogarcia234

+0

Code folgt: xidle = XOpenDisplay (0); if (xidle) { \t XScreenSaverInfo * info = XScreenSaverAllocInfo(); \t XScreenSaverQueryInfo (xidle, DefaultRootWindow (xidle), info); \t ret = (info-> Leerlauf> 60000? (Info-> Leerlauf> 900000? 2: 1): 0); } – eduardogarcia234

Antwort

0

Nur meine eigene Frage, wenn jemand das gleiche Problem hat wie ich.

Die Erkennung der Inaktivität (Leerlauf) außerhalb der grafischen Oberfläche von X ist nur eine Sache der USB Tastatur/Mausaktivität durch Überwachung ihrer IRQs (normalerweise IRQ 1/IRQ 12) auf/proc/interrupt oder einfacher (unterstützt andere USB Eingänge wie sogar Joysticks!) durch Überwachung von/proc/stat auf der Zeile "softirq", zweite numerische Spalte, die die Anzahl übertragener Bytes enthält, wenn diese Geräte einen Eingang haben (Mausbewegung oder Taste gedrückt/losgelassen)

Dies erreicht leicht in C von Zeit zu Zeit, fopen/fread auf diesen Feldern Vergleich der Werte mit alten.

Vielen Dank für meine intensive Forschung über Linux-Interna & Benutzer Olaf, die ein riesiges Wissen über das Offensichtliche haben.

Verwandte Themen