2010-01-02 6 views
5

Meine Anwendung ist in zwei Teile aufgeteilt. Die Hauptanwendung und ein Hilfswerkzeug. Das Hilfsprogramm führt eine Aufgabe mit erhöhten Berechtigungen aus.Wie kann ich mehrere Instanzen einer Anwendung mit launchd starten?

Der launchd plist sieht wie folgt aus: (Nur wichtige Einstellungen enthalten.)

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

Gibt es eine Möglichkeit, eine neue Helfer-Instanz für jede Verbindung mit der Buchse zu starten?

Oder gibt es alternativ eine Vorlage für die Bearbeitung mehrerer Anfragen? (Ich mache das selbst im Moment, das ist ziemlich viel hässlich Code.)

Antwort

1

Dies wird wahrscheinlich meine erste Antwort in Stackoverflow sein :)

Zuerst Set inetdCompatibility mit Warten auf false gesetzt. Dies wird launchd, um den Socket zu akzeptieren.

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

Einmal akzeptiert launchd den Socket. Das Socket wird als STDIN_FILENO in Ihr Programm übernommen. Ihr launchd-Prozess kann das den Socket akzeptiert Zugriff wie folgt: (I den Code aus Open-Source-sshd kopiert)

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

Die sock_in bereits akzeptiert. So kann Ihr Programm es verwenden, ohne zu akzeptieren.

Ich gehe davon aus, Sie haben bereits einen Plist, der einen Socket-Port für Sie überwachen wird. Wenn nicht, ist es möglich, dies wie folgt zu tun. Es wird einen Launchd-Socket erstellen, der Port 18411 mit IPv4 TCP abhört.

<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

Vielen Dank für Ihre Antwort. Ich bin ein wenig traurig, dass die einzige Möglichkeit, dies zu tun, darin zu bestehen scheint, eine Kompatibilitätsfunktion zu verwenden, anstatt sie direkt von launchd anzubieten. Ich werde das Kopfgeld noch zwei Tage offen halten, vielleicht weiß jemand anderes mehr als wir. –