Мое предположение, что вы получаете EAGAIN, потому что вы нажимаете ограничения ресурсов. Существует системное ограничение количества потоков/процессов, которые могут быть запущены. Вы можете просмотреть его с
cat /proc/sys/kernel/threads-max
и изменить его с помощью
echo 100000 > /proc/sys/kernel/threads-max
соответственно. Скорее всего, вы нарушаете ограничения пользователей на процессы. Вы должны прочитать страницы руководства и выполнить поиск по getrlimit
и ulimit
. Существует много информации о них прямо здесь, на SO.
Предполагая, что вы рождаете все эти процессы от одного родителя, им должно быть легко отслеживать их. Вы увеличиваете счетчик в родительском до fork()
. Если дети порождают детей, тогда это становится более сложным, и вам понадобится использовать разделяемую память или какой-либо другой механизм IPC. В любом случае вы можете определить статус своих детей, используя системные вызовы wait()
и waitpid()
, и на основе этого уменьшите свои счетчики процессов. Данные состояния, возвращаемые wait
, сообщают вам о прекращении расположения каждого ребенка. Опять же, есть много вопросов о SO, которые в значительной степени описывают это, если вы столкнулись с проблемой.
В ответ на ваш основной вопрос есть способы запросить систему (обычно через/proc) для некоторых ресурсов, с которыми вы связаны. Это почти всегда неправильный путь, если вы обеспокоены своими собственными ресурсами. В ваших возможностях следить за ними самостоятельно - и гораздо эффективнее.
Удачи. Надеюсь, это указывает на правильные направления.
Сколько детей/нитей вы создаете? – Duck
Наверное, совсем немного, они чаще всего обращаются к fork() перед запуском exec(), но я хочу знать, правильно ли они заканчиваются или нет. – kamziro