正如路易斯·格巴已经指出的那样,你的问题与线程无关。我已相应地编辑了您的标题和标签。
我有大量的 shell 命令通过授权服务的“AuthorizationExecuteWithPrivileges”调用以 root/admin 权限执行。
不要那样做。该功能的存在只是为了让您可以将 root:admin 所有权和 setuid 模式位恢复到您想要以 root 身份运行的工具。
这个想法是,您应该将应该以 root 身份运行的代码与不需要以 root 身份运行的部分分解为一个完全独立的程序,以便需要 root 的部分可以拥有它(通过 setuid 位)并且不需要root的部分可以没有它(通过没有setuid)。
代码示例位于授权服务编程指南 http://developer.apple.com/documentation/Security/Conceptual/authorization_concepts/.
问题是,一段时间后(10-15 秒,可能是 100 个 shell 命令),程序停止响应,并在调试器中出现以下错误:
couldn't fork: errno 35
是的。您一次只能运行几百个进程。这是操作系统强制的限制。
这是一个软限制,这意味着您可以提高它,但只能提高到无法提高的硬限制。查看输出limit
and limit -h
(在 zsh 中;我不知道其他 shell)。
您需要等待进程完成才能运行更多进程。
然后,当应用程序运行时,我无法启动更多应用程序。
因为您已经运行了允许的尽可能多的进程。 x-hundred-process 限制是针对每个用户的,而不是针对每个进程的。
我研究了这个问题,显然这意味着没有更多的线程可供系统使用。
不,不是的。
errno 错误代码有很多用途。EAGAIN
(35,“资源暂时不可用”)可能意味着当由启动线程的系统调用设置时不再有线程,但并不意味着当由另一个系统调用或函数设置时。
您引用的错误消息明确指出它是由fork
,这是启动新的系统调用process,不是新的thread。在这种背景下,EAGAIN
意思是“你已经运行了尽可能多的进程”。看fork 手册页 http://developer.apple.com/documentation/Darwin/Reference/ManPages/man2/fork.2.html.
但是,我使用活动监视器进行了检查,发现我的应用程序仅使用 4-5 个线程。
See?
为了解决这个问题,我认为我需要做的是将 shell 命令分离到一个单独的线程中(远离主线程)。
每个线程启动一个进程只会帮助您更快地耗尽进程。
我以前从未使用过线程...
听起来您还没有,因为您所指的函数启动了一个进程,而不是一个线程。