我不能运行超过100个进程

ind*_*gie 3 macos process authorizationservices

我通过授权服务的"AuthorizationExecuteWithPrivileges"调用使用root/admin priveleges执行大量shell命令.问题是,经过一段时间(10-15秒,可能是100个shell命令),程序在调试器中停止响应此错误:

不能分叉:错误35

然后在应用程序运行时,我无法再启动应用程序.我研究了这个问题,显然这意味着没有更多的线程供系统使用.但是,我使用Activity Monitor检查了我的应用程序只使用了4-5个线程.

为了解决这个问题,我认为我需要做的是将shell命令分成一个单独的线程(远离主线程).我之前从未使用过线程,我不确定从哪里开始(我找不到全面的例子)

谢谢

Pet*_*sey 7

正如Louis Gerbarg已经指出的那样,你的问题与线程无关.我已经相应地编辑了你的标题和标签.

我通过授权服务的"AuthorizationExecuteWithPrivileges"调用使用root/admin priveleges执行大量shell命令.

不要那样做.该功能仅存在,因此您可以将root:admin所有权和setuid模式位还原到要以root身份运行的工具.

我们的想法是,您应该将应该以root身份运行的代码分解为一个完全独立的程序,而不需要以root身份运行的部分,以便需要root的部分可以拥有它(通过setuid位)和不需要root的部分可以没有它(通过没有setuid).

代码示例位于" 授权服务编程指南"中.

问题是,经过一段时间(10-15秒,可能是100个shell命令),程序在调试器中停止响应此错误:

couldn't fork: errno 35
Run Code Online (Sandbox Code Playgroud)

是啊.您一次只能运行几百个进程.这是操作系统强制执行的限制.

这是一个软限制,这意味着你可以提高它 - 但只能达到你无法提出的硬限制.见的输出limit,并limit -h(在zsh中,我不知道其他的shell).

在运行更多进程之前,您需要等待进程完成.

然后在应用程序运行时,我无法再启动应用程序.

因为您已经运行了许多允许的进程.x-100进程限制是每个用户,而不是每个进程.

我研究了这个问题,显然这意味着没有更多的线程供系统使用.

不,不是的.

errno错误代码用于很多事情.EAGAIN(35,"资源暂时不可用")可能意味着在启动线程的系统调用设置时不再有线程,但这并不意味着由另一个系统调用或函数设置时.

您明确引用的错误消息表明它是由设置的fork,这是系统调用以启动新进程,而不是新线程.在这种情况下,EAGAIN意味着"您已经在运行尽可能多的流程".请参阅fork联机帮助页.

但是,我使用Activity Monitor检查了我的应用程序只使用了4-5个线程.

看到?

为了解决这个问题,我认为我需要做的是将shell命令分成一个单独的线程(远离主线程).

每个线程启动一个进程只会帮助您更快地耗尽进程.

我之前从未使用过线程......

听起来你还没有,因为你所指的功能启动一个进程,而不是一个线程.