我的申请分为两部分.主要应用程序和帮助工具.帮助工具执行具有提升权限的任务.
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>
Run Code Online (Sandbox Code Playgroud)
有没有办法为套接字的每个连接启动一个新的帮助器实例?
或者,是否存在用于处理多个请求的现有模板?(我现在正在做这个,这是很多丑陋的代码.)
这可能是我在 Stackoverflow 上的第一个答案:)
首先,将 inetdCompatibility 和 Wait 设置为 false。这将使 launchd 接受套接字。
<key>inetdCompatibility</key>
<dict>
<key>Instances</key>
<integer>42</integer>
<key>Wait</key>
<false/>
</dict>
Run Code Online (Sandbox Code Playgroud)
有一次,launchd 接受了套接字。接受到的套接字将作为 STDIN_FILENO 传递到您的程序中。你的launchd进程可以访问接受的套接字,如下所示:(我从开源sshd复制了代码)
int sock_in;
int sock_out;
sock_in = sock_out = dup(STDIN_FILENO);
NSLog(@"socket descriptor: %d", sock_in);
Run Code Online (Sandbox Code Playgroud)
sock_in 已被接受。这样你的程序就可以使用它而无需调用accept。
我假设您已经有一个 plist 可以为您监视套接字端口。如果没有,可以按如下方式进行。它将创建一个 launchd 套接字,使用 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>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
494 次 |
| 最近记录: |