Eu não tenho o HP-UX disponível para mim e nunca fui um grande fã do HP-UX.
Parece que no Linux, um limite por processo ou talvez por usuário limita a quantidade de processos filhos existentes. Você pode vê-lo com o limit
Zsh embutido (parece ser análogo a ulimit -u
no bash):
1002 % limit
cputime unlimited
filesize unlimited
datasize unlimited
stacksize 8MB
coredumpsize 0kB
memoryuse unlimited
maxproc 16136
...
Isso 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)
o suficiente. Além disso, o número de sinais SIGCHLD recebidos nunca é o mesmo que o número de processos filho bifurcados: Acredito que o kernel do linux envie às vezes 1 SIGCHLD para um número de processos filhos que saíram.
De qualquer forma, no meu laptop Arch linux, recebo 16088 processos filho bifurcados, e esse tem que ser o número de zumbis, já que o programa não faz wait(2)
chamadas de sistema no manipulador de sinal.
No meu servidor Slackware 12, recebo 6076 processos-filhos, o que corresponde ao valor de maxproc 6079
. Minhas
O ID do usuário possui 2 outros processos em execução, sshd
e Zsh. Juntamente com a primeira instância não-zumbi do programa acima que faz 6079.
A chamada do sistema fork(2)
falha com um erro "Recurso temporariamente indisponível". Não vejo nenhuma outra evidência de qual recurso está indisponível. Eu obtenho números um pouco diferentes se eu executo meu programa simultaneamente em 2 xterms diferentes, mas eles somam o mesmo número que se eu o executasse em um xterm. Eu suponho que seja entradas de tabela de processo, ou swap ou algum recurso de todo o sistema, e não apenas um limite arbitrário.
Eu não tenho mais nada para testar agora.