Я думаю, вы достигли предела количества процессов или памяти.
Когда я пробую вашу программу на своем компьютере и достигаю состояния pid == -1
, fork ()
возвращает ошибку EAGAIN
с сообщением об ошибке. : Ресурс временно недоступен
. Как обычный пользователь , я мог создать около 15 тысяч процессов.
Это EAGAIN
могло произойти по нескольким причинам, подробно описанным в вилке man 2
:
В моем случае, я думаю, я только что достиг предела RLIMIT_NPROC
, то есть того, что обычно показывает ulimit -u
. Лучше всего отображать это ограничение в программе, чтобы вы имели реальное значение, а не пределы оболочки.
#include <sys/time.h>
#include <sys/resource.h>
int main() {
struct rlimit rlim;
getrlimit(RLIMIT_NPROC, &rlim);
printf("RLIMIT_NPROC soft: %d, hard: %d\n", rlim.rlim_cur, rlim.rlim_max);
Что дает:
RLIMIT_NPROC soft: 15608, hard: 15608
total: 15242
Что выглядит разумным, поскольку у меня запущены другие процессы, включая веб-браузер.
Теперь, как root , ограничения на самом деле больше не применяются, и я мог fork ()
гораздо больше: я создал более 30 тысяч процессов, что близко к моим 32 тысячам pid_max
.
Теперь, если я возьму свой обычный пользователь PID оболочки ( echo $$
) и как root в другой оболочке, я сделаю: prlimit --pid $ SHELLPID --nproc = 30000
и затем запустите вашу программу в этой оболочке, я могу создать почти 30k процессов:
RLIMIT_NPROC soft: 30000, hard: 30000
total: 29678
Наконец: вам также следует учитывать использование памяти, потому что в моей системе я использовал много оперативной памяти и свопинга для создания всех этих процессов, и, возможно, это был предел, который вы достигли. Свяжитесь с бесплатно
.