Louis Gerbargがすでに指摘しているように、あなたの質問はスレッドとは何の関係もありません。それに応じてあなたのタイトルとタグを編集しました。
AuthorizationServicesの「AuthorizationExecuteWithPrivileges」呼び出しを介してroot/admin特権で実行されているシェルコマンドが大量にあります。
そうしないでください。この関数は、root:adminの所有権とsetuidモードビットをrootとして実行するツールに復元できるようにするためにのみ存在します。
ルートとして実行する必要のあるコードを、ルートとして実行する必要のない部分とは完全に別のプログラムに分解して、ルートを必要とする部分が(setuidビットを介して)それを持つことができるようにするという考え方です。 rootを必要としない部分は、rootなしで実行できます(setuidがないため)。
コード例は、AuthorizationServicesプログラミングガイドにあります。
問題は、しばらくすると(10〜15秒、おそらく100個のシェルコマンド)、プログラムがデバッガーでこのエラーで応答を停止することです。
couldn't fork: errno 35
うん。一度に実行できるプロセスは数百にすぎません。これはOSによって強制される制限です。
これはソフト制限です。つまり、引き上げることができますが、引き上げることができないハード制限までしか引き上げることができません。limit
andの出力を参照してくださいlimit -h
(zshで;他のシェルについてはわかりません)。
さらにプロセスを実行する前に、プロセスが終了するのを待つ必要があります。
そして、アプリの実行中は、これ以上アプリケーションを起動できません。
許可されている数のプロセスをすでに実行しているためです。そのx百プロセスの制限は、プロセスごとではなく、ユーザーごとです。
私はこの問題を調査しましたが、システムで使用できるスレッドがこれ以上ないことを意味しているようです。
いいえ、違います。
errnoエラーコードは多くのことに使用されます。EAGAIN
(35、「リソースが一時的に利用できません」)は、スレッドを開始するシステムコールによって設定されたときにスレッドがなくなることを意味する場合がありますが、別のシステムコールまたは関数によって設定されたときにそれを意味するわけではありません。
引用したエラーメッセージは、それがによって設定されたことを明示的に示しています。これは、新しいスレッドではなく、新しいプロセスfork
を開始するためのシステムコールです。その文脈では、「あなたはすでにできるだけ多くのプロセスを実行している」という意味です。フォークのマンページを参照してください。EAGAIN
ただし、Activity Monitorを使用して確認したところ、アプリは4〜5スレッドしか使用していません。
見る?
この問題を解決するには、シェルコマンドを(メインスレッドから離れた)別のスレッドに分離する必要があると思います。
スレッドごとに1つのプロセスを開始すると、プロセスがはるかに速く不足するのに役立ちます。
私はこれまでスレッドを使用したことがありません…</p>
参照している関数がスレッドではなくプロセスを開始するため、まだ行っていないようです。