2010-01-02 6 views
5

La mia domanda è divisa in due parti. L'applicazione principale e uno strumento di supporto. Lo strumento di supporto esegue un'attività con autorizzazioni elevate.Come posso avviare più istanze di un'applicazione usando launchd?

Il plist launchd assomiglia a questo: (Solo le impostazioni importanti inclusi.)

<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> 

C'è un modo per lanciare una nuova istanza di aiuto per ogni connessione alla presa?

In alternativa, esiste un modello esistente per la gestione di più richieste? (Sto facendo io stesso in questo momento, che è un bel po 'di codice brutto.)

risposta

1

Questa sarà probabilmente la mia prima risposta in StackOverflow :)

In primo luogo, Set inetdCompatibility con Wait su false. Questo farà sì che launchd accetti il ​​socket.

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

Una volta, launchd ha accettato la presa. Il socket accettato verrà passato al tuo programma come STDIN_FILENO. Il vostro processo launchd può accedere al accettato la presa nel modo seguente: (ho copiato il codice da sshd open source)

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

Il sock_in è già accettata. Quindi il tuo programma può usarlo senza chiamare accept.

Suppongo che tu abbia già un plist che monitorerà una porta socket per te. In caso contrario, è possibile farlo come segue. Creerà un socket launchd per ascoltare la porta 18411 con TCP IPv4.

<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

Grazie per la risposta. Sono un po 'triste che l'unico modo per farlo sembra essere quello di usare una funzione di compatibilità invece di essere offerta direttamente da launchd. Terrò aperta la taglia per altri due giorni, forse qualcun altro ne sa più di noi. –

Problemi correlati