¿Cuál es la mejor práctica para una aplicación daemon que se ejecuta como raíz y necesita acceso a la GUI? [cerrado]

Estoy portando una aplicación C++/Qt desde Windows. En Windows, el programa se ejecuta como un servicio. Se desaconseja que los programas que se ejecutan como un servicio también interactúen con el usuario y muestren elementos de la GUI.

Por lo tanto, mi programa tiene dos partes. La primera parte se ejecuta como un demonio de servicio y reproduce audio en segundo plano. El programa se inicia cuando se inicia la computadora. El segundo programa, que se inicia cuando cualquier usuario inicia sesión (a través del menú Inicio->Todos los usuarios->Inicio), se comunica a través de un socket local con el demonio de servicio para mostrar una ventana emergente de GUI cuando se reproduce el audio.

Pasando a MacOS, ¿cuál es la mejor práctica para utilizar el mismo programa?

¿Debería fusionar ambos programas en uno y ejecutarlo como root a través de launchd y hacer que el demonio muestre la GUI y reproduzca audio?

¿O debería mantenerlo como dos programas como ahora: el demonio raíz reproduce audio y encuentra una forma en que el segundo programa se puede ejecutar automáticamente cuando cada usuario inicia sesión?

Respuestas (1)

En macOS, debe evitar ejecutar cualquier proceso como root. Apple probablemente sugeriría mantener este tipo de aplicación en dos partes. Cada parte debe estar en un espacio aislado con los derechos apropiados.

Su proceso de fondo de toda la computadora no podrá acceder a la interfaz gráfica. Necesitará un segundo proceso que se ejecute dentro de la sesión del usuario para proporcionar una interfaz al usuario.

Úselo launchdpara iniciar el proceso de su computadora a pedido; consulte los servicios de XPC a continuación. De esta manera, mientras no se juega nada, evitas consumir recursos.

Servicios XPC

Para macOS, Apple quiere que te comuniques usando la arquitectura de servicios XPC . Este enfoque utiliza puertos Mach en el nivel bajo, pero sus procesos no necesitan preocuparse demasiado por ese detalle.

Bueno. Entonces, ¿es factible en la Mac hacer que el programa GUI se inicie automáticamente cuando cualquier usuario inicie sesión en el sistema?
Sí, un trabajo de lanzamiento /Library/LaunchAgents/proporcionará esto. Ver man launchd.plistpara más detalles. Buena suerte; ¡Esto será un desafío! ;-)