我的申请分为两部分。主要应用程序和帮助工具。帮助工具执行具有提升权限的任务。
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>
有没有办法为套接字的每个连接启动一个新的帮助器实例?
或者,是否存在用于处理多个请求的现有模板? (我现在正在做这个,这是很多丑陋的代码。)
答案 0 :(得分:1)
这可能是我在Stackoverflow中的第一个答案:)
首先,使用Wait to false设置inetdCompatibility。 这将使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创建一个launchd socket侦听端口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>