XOpenDisplay(NULL)
würde die Umgebungsvariable DISPLAY
untersuchen, die normalerweise nicht im Kontext von udev festgelegt ist. Um XOpenDisplay(something)
(einschließlich something=NULL
) verwenden zu können, benötigen Sie den Zugriffsschlüssel für die X-Server-Instanz.
Die Umgebungsvariable XAUTHORITY
muss auf den Speicherort der Schlüsseldatei gesetzt werden, wenn Sie XOpenDisplay
oder ein grafisches Programm verwenden möchten, das davon Gebrauch macht. Wenn diese env var leer ist, wird ~/.Xauthority
als Fallback verwendet.
Der Versuch, ein grafisches Programm von udev zu starten, ist eine schlechte Idee (lies: etwas ist falsch in Ihrem Ansatz und Design): Sie kennen die X-Display-Nummer nicht. Sie können es auch nicht erraten, da es sehr wohl mehr als einen aktiven X-Server gibt. Und dann müssen Sie seine Schlüsseldatei haben, die nicht immer zu bestimmen oder zu erhalten ist. udev kann als root ausgeführt werden, aber es gibt Dinge wie NFS mounts mit root_squash
, und die XAUTHORITY
Variable, mit der Leute ihre Schlüsseldatei verschieben können.
Grafische Probleme funktionieren heutzutage so, dass der Benutzer oder die Desktopumgebung, die er benutzt, ein Hintergrundprogramm starten muss, das gezielt auf bestimmte Ereignisse wartet. Nur damit Sie nicht einfach in die Bildschirme der Leute eindringen können, sondern sich an ihr Ereignisbenachrichtigungssystem halten müssen.
Eigentlich rate ich es ist, weil X ein Multiuser-Server ist und ein Display-Handle im Kontext eines aktuellen X-Benutzers erworben werden muss, aber wenn jemand mich auf die Details von all dem hinweisen könnte, die hilfreich wären. – djp