Acho que você atingiu um número de limites de processos ou um limite de memória.
Quando eu tento seu programa no meu computador e alcanço o estado pid == -1
, fork()
retorna o erro EAGAIN
, com a mensagem de erro: Resource temporarily unavailable
. Como usuário normal , posso criar aproximadamente 15k processos.
Existem vários motivos pelos quais isso pode acontecer EAGAIN
, detalhado em man 2 fork
:
- memória insuficiente,
- atingindo um limite como RLIMIT_NPROC,
- especificações específicas do agendador de prazos.
No meu caso, acho que eu só toquei no RLIMIT_NPROC
limit, também conhecido como ulimit -u
normalmente. O melhor é exibir este limite dentro do programa, assim você tem o valor real, não os limites da sua concha.
#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);
Quais rendimentos:
RLIMIT_NPROC soft: 15608, hard: 15608
total: 15242
O que parece razoável, já que tenho outros processos em execução, incluindo um navegador da web.
Agora, como root , os limites realmente não se aplicam mais e eu poderia fork()
muito mais: eu criei mais de 30k processos, perto dos meus 32k pid_max
.
Agora, se eu pegar o PID do meu usuário normal ( echo $$
) e como root em outro shell, eu faço: prlimit --pid $SHELLPID --nproc=30000
e então lançar o seu programa neste shell, eu posso criar quase 30k processos:
RLIMIT_NPROC soft: 30000, hard: 30000
total: 29678
Finalmente: você também deve considerar o uso da memória, porque no meu sistema, eu usei muito de RAM e troquei para criar todos esses processos, e talvez tenha sido o limite você bateu. Verifique com free
.