Não tenho o HP-UX disponível para mim e nunca fui um grande fã do HP-UX.
Parece que no Linux, existe um limite por processo ou talvez por usuário de quantos processos filhos existem. Você pode vê-lo com o limit
Zsh embutido (parece análogo ao ulimit -u
bash):
1002 % limit
cputime unlimited
filesize unlimited
datasize unlimited
stacksize 8MB
coredumpsize 0kB
memoryuse unlimited
maxproc 16136
...
Está em um laptop Arch linux.
Eu escrevi um pequeno programa para testar esse limite:
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
volatile int sigchld_cnt = 0;
voida
sigchld_hdlr(int signo)
{
++sigchld_cnt;
}
int
main(int ac, char **av)
{
int looping = 1;
int child_cnt = 0;
int status;
signal(SIGCHLD, sigchld_hdlr);
printf("Parent PID %d\n", getpid());
while (looping)
{
switch (fork())
{
case 0:
_exit(0);
break;
case -1:
fprintf(stderr, "Problem with fork(), %d children: %s\n",
child_cnt, strerror(errno));
looping = 0;
break;
default:
++child_cnt;
break;
}
}
fprintf(stderr, "Sleeping, forked %d child processes\n", child_cnt);
fprintf(stderr, "Received %d sigchild\n", sigchld_cnt);
sleep(10);
looping = 1;
do {
int x = wait(&status);
if (x != -1)
--child_cnt;
else if (errno != EINTR) {
fprintf(stderr, "wait() problem %d children left: \%s\n",
child_cnt, strerror(errno));
looping = 0;
}
} while (looping);
printf("%d children left, %d SIGCHLD\n", child_cnt, sigchld_cnt);
return 0;
}
Foi surpreendentemente difícil "coletar" todos os zumbis chamando wait(2)
vezes suficientes. Além disso, o número de sinais SIGCHLD recebidos nunca é o mesmo que o número de processos filhos bifurcados: acredito que o kernel do linux às vezes envia 1 SIGCHLD para vários processos filhos encerrados.
De qualquer forma, no meu laptop Arch linux, tenho 16088 processos filhos bifurcados, e esse deve ser o número de zumbis, pois o programa não faz wait(2)
chamadas do sistema no manipulador de sinais.
No meu servidor Slackware 12, recebo 6076 processos filhos, o que corresponde ao valor de maxproc 6079
. Meu ID do usuário possui 2 outros processos em execução sshd
e o Zsh. Juntamente com a primeira instância não zumbi do programa acima, que produz 6079.
A fork(2)
chamada do sistema falha com o erro "Recurso temporariamente indisponível". Não vejo nenhuma outra evidência de qual recurso está indisponível. Eu recebo números um pouco diferentes se eu executar meu programa simultaneamente em 2 xterms diferentes, mas eles somam o mesmo número como se eu o executasse em um xterm. Presumo que sejam entradas da tabela de processos, ou swap ou algum recurso de todo o sistema, e não apenas um limite arbitrário.
Não tenho mais nada em execução para experimentá-lo agora.