Was ist die beste Vorgehensweise für eine Daemon-Anwendung, die als Root ausgeführt wird und Zugriff auf die GUI benötigt? [geschlossen]

Ich portiere über eine C++/Qt-Anwendung von Windows. Unter Windows läuft das Programm als Dienst. Es wird davon abgeraten, dass Programme, die als Dienst ausgeführt werden, auch mit dem Benutzer interagieren und GUI-Elemente anzeigen.

Daher besteht mein Programm aus zwei Teilen. Der erste Teil läuft als Service-Daemon und spielt Audio im Hintergrund ab. Das Programm startet, wenn der Computer hochfährt. Das zweite Programm, das gestartet wird, wenn sich ein Benutzer anmeldet (über Startmenü -> Alle Benutzer -> Start), kommuniziert über einen lokalen Socket mit dem Service-Daemon, um ein GUI-Popup anzuzeigen, wenn der Ton abgespielt wird.

Was ist die beste Vorgehensweise, um zu MacOS überzugehen, um dasselbe Programm zu verwenden?

Sollte ich beide Programme zu einem zusammenführen und es als root über launchd ausführen und den einen Daemon dazu bringen, die GUI anzuzeigen und Audio abzuspielen?

Oder sollte ich es lieber als zwei Programme beibehalten, wie es jetzt ist - Root-Daemon, der Audio abspielt, und einen Weg finden, dass das zweite Programm automatisch ausgeführt werden kann, wenn sich jeder Benutzer anmeldet?

Antworten (1)

Unter macOS sollten Sie vermeiden, Prozesse als root. Apple würde wahrscheinlich vorschlagen, diese Art von Anwendung in zwei Teilen zu belassen. Jeder Teil sollte mit entsprechenden Berechtigungen in einer Sandbox bereitgestellt werden.

Ihr computerweiter Hintergrundprozess kann nicht auf die grafische Benutzeroberfläche zugreifen. Sie benötigen einen zweiten Prozess, der in der Sitzung des Benutzers ausgeführt wird, um dem Benutzer eine Schnittstelle bereitzustellen.

Wird verwendet launchd, um Ihren computerweiten Prozess bei Bedarf zu starten; siehe XPC-Dienste unten. Auf diese Weise vermeiden Sie den Verbrauch von Ressourcen, während nichts abgespielt wird.

XPC-Dienste

Für macOS möchte Apple, dass Sie über die XPC-Dienstarchitektur kommunizieren . Dieser Ansatz verwendet Mach-Ports auf niedriger Ebene, aber Ihre Prozesse müssen sich nicht allzu sehr um dieses Detail kümmern.

Okay. Ist es also auf dem Mac möglich, das GUI-Programm automatisch zu starten, wenn sich ein Benutzer am System anmeldet?
Ja, ein launchd-Job in /Library/LaunchAgents/bietet dies. Siehe man launchd.plistfür mehr Details. Viel Glück; das wird herausfordernd! ;-)