2010-01-02 204 views
5

我的應用程序分爲兩部分。主要的應用程序和幫助工具。幫助工具使用提升的權限執行任務。如何使用launchd啓動應用程序的多個實例?

的的launchd plist中看起來是這樣的:(只有重要的設置包括在內。)

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

有沒有推出新的輔助實例爲每個連接到插座的方法嗎?

或者,是否有現有的模板來處理多個請求? (我目前自己這樣做,這是相當多的醜陋的代碼。)

回答

1

這可能會是我的第一#1回答:)

首先,設置inetdCompatibility以等待爲false。 這將使launchd接受套接字。

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

一旦launchd接受了套接字,接受的套接字將作爲STDIN_FILENO傳遞到您的程序中。你的桌面進程可以訪問接受了插座如下:(我複製從開源的sshd的代碼)

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

的sock_in已被接受。所以你的程序可以使用它而不需要調用accept。

我假設你已經有一個plist,它將監視你的一個套接字端口。如果沒有,可以按照以下步驟進行。它將爲使用IPv4 TCP的端口18411創建啓動套接字偵聽。

<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

謝謝你的回答。我有點難過,做到這一點的唯一方法似乎是使用兼容性功能,而不是直接由launchd提供。我會保持開放兩天的恩惠,也許別人比我們知道更多。 –

相關問題