2010-01-02 13 views
5

Mi aplicación se divide en dos partes. La aplicación principal y una herramienta de ayuda. La herramienta auxiliar realiza una tarea con permisos elevados.¿Cómo puedo iniciar varias instancias de una aplicación usando launchd?

PLIST launchd se parece a esto: (Sólo se incluyeron ajustes importantes.)

<key>UserName</key> 
<string>root</string> 
<key>ProgramArguments</key> 
<array> 
    <string>/Library/PrivilegedHelperTools/helperTool</string> 
</array> 
<key>Sockets</key> 
<dict> 
    <key>IPC</key> 
    <dict> 
     <key>SockPathName</key> 
     <string>/tmp/TheSocket</string> 
    </dict> 
</dict> 

¿Hay una manera de poner en marcha una nueva instancia de ayuda para cada conexión a la toma?

O, como alternativa, ¿existe una plantilla existente para manejar solicitudes múltiples? (Estoy haciendo esto a mí mismo en este momento, lo cual es una gran cantidad de código feo.)

Respuesta

1

esta probablemente será mi primera respuesta en Stackoverflow :)

En primer lugar, Conjunto inetdCompatibility con Esperar a falso. Esto hará que launchd acepte el socket.

<key>inetdCompatibility</key> 
<dict> 
    <key>Instances</key> 
    <integer>42</integer> 
    <key>Wait</key> 
    <false/> 
</dict> 

Una vez, ejecute aceptado el socket. El socket aceptado se pasará a su programa como STDIN_FILENO. Su proceso de launchd puede acceder a la aceptaron la toma de la siguiente manera: (He copiado el código de fuente abierta sshd)

int sock_in; 
int sock_out;   
sock_in = sock_out = dup(STDIN_FILENO); 
NSLog(@"socket descriptor: %d", sock_in); 

El sock_in ya se acepta. Entonces su programa puede usarlo sin llamar a accept.

Supongo que ya tiene un plist que controlará un puerto de socket para usted. Si no, es posible hacer eso de la siguiente manera. Creará un socket launchd para escuchar el puerto 18411 con IPv4 TCP.

<key>Sockets</key> 
<dict> 
    <key>Listeners</key> 
    <dict> 
     <key>SockServiceName</key> 
     <string>18411</string> 
     <key>SockType</key> 
     <string>stream</string> 
     <key>SockFamily</key> 
     <string>IPv4</string> 
    </dict> 
</dict> 
+0

Gracias por su respuesta. Estoy un poco triste porque la única forma de hacer esto parece ser utilizar una característica de compatibilidad en lugar de ser lanzada directamente por launchd. Mantendré el botín abierto por otros dos días, tal vez alguien más sepa más que nosotros. –

Cuestiones relacionadas