Как уже указал Луи Гербарг, ваш вопрос не имеет никакого отношения к темам. Я соответственно отредактировал ваш заголовок и теги.
У меня огромное количество команд оболочки, выполняемых с привилегиями root / admin с помощью вызова AuthorizationExecuteWithPrivileges службы авторизации.
Не делай этого. Эта функция существует только для того, чтобы вы могли восстановить права root: admin и бит режима setuid для инструмента, который вы хотите запустить от имени root.
Идея состоит в том, что вы должны отделить код, который должен запускаться от имени пользователя root, в совершенно отдельную программу от части, которая не должна запускаться от имени пользователя root, так чтобы часть, которой требуется root, могла иметь его (через бит setuid ) и часть, которая не нуждается в root, может обойтись без него (через отсутствие setuid).
Пример кода приведен в Руководство по программированию служб авторизации .
Проблема в том, что через некоторое время (10-15 секунд, может быть, 100 команд оболочки) программа перестает отвечать на эту ошибку в отладчике:
couldn't fork: errno 35
Да. Вы можете запустить только пару сотен процессов одновременно. Это установленное ОС ограничение.
Это мягкий предел, который означает, что вы можете поднять его, но только до жесткого предела, который вы не можете поднять. Смотрите вывод limit
и limit -h
(в zsh; я не знаю о других оболочках).
Вам нужно дождаться завершения процессов, прежде чем запускать больше процессов.
А потом, пока приложение работает, я не могу больше запускать приложения.
Потому что вы уже запускаете столько процессов, сколько вам разрешено. Это ограничение x-сотни процессов для каждого пользователя, а не для процесса.
Я исследовал эту проблему и, по-видимому, это означает, что больше нет доступных потоков для использования системой.
Нет, это не так.
Коды ошибок errno используются для многих вещей. EAGAIN
(35, «ресурс временно недоступен») может не означать больше потоков при установке системным вызовом, запускающим поток, но это не означает, что при установке другим системным вызовом или функцией.
В сообщении об ошибке, которое вы явно указали, говорится, что оно было установлено fork
, то есть системным вызовом для запуска нового процесса , а не нового потока . В этом контексте EAGAIN
означает «вы уже запускаете столько процессов, сколько можете». См. справочную страницу .
.
Однако я проверил с помощью Activity Monitor, и мое приложение использует только 4-5 потоков.
См
Чтобы решить эту проблему, я думаю, что мне нужно сделать, это разделить команды оболочки в отдельный поток (от основного потока).
Запуск одного процесса на поток поможет вам только быстрее завершить процессы.
Я никогда раньше не использовал потоки ...
Похоже, что вы до сих пор этого не сделали, поскольку функция, на которую вы ссылаетесь, запускает процесс, а не поток.