5

私のアプリケーションは 2 つの部分に分かれています。メイン アプリケーションとヘルパー ツール。ヘルパー ツールは、昇格された権限でタスクを実行します。

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>

ソケットへの接続ごとに新しいヘルパー インスタンスを起動する方法はありますか?

あるいは、複数のリクエストを処理するための既存のテンプレートはありますか? (私は今これを自分でやっていますが、これは非常に多くの醜いコードです。)

4

1 に答える 1

1

これはおそらく、Stackoverflow での最初の回答になるでしょう :)

最初に、Wait を使用して inetdCompatibility を false に設定します。これにより、launchd がソケットを受け入れるようになります。

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

一度、launchd はソケットを受け入れました。受け入れられたソケットは、STDIN_FILENO としてプログラムに渡されます。あなたの launchd プロセスは、次のように受け入れられたソケットにアクセスできます: (私はオープンソースの 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 をリッスンする launchd ソケットを作成します。

<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>
于 2016-03-05T03:34:04.093 に答える