5

我的申请分为两部分。主应用程序和辅助工具。帮助工具执行具有提升权限的任务。

启动的 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 中的第一个答案 :)

首先,将 inetdCompatibility with Wait 设置为 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 创建一个启动套接字侦听。

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