No tengo HP-UX disponible para mí, y nunca he sido un gran fanático de HP-UX.
Parece que en Linux, existe un límite por proceso o quizás por usuario sobre cuántos procesos secundarios existen. Puedes verlo con el limit
Zsh incorporado (parece ser análogo a ulimit -u
bash):
1002 % limit
cputime unlimited
filesize unlimited
datasize unlimited
stacksize 8MB
coredumpsize 0kB
memoryuse unlimited
maxproc 16136
...
Eso está en una computadora portátil Arch Linux.
Escribí un pequeño programa para probar ese límite:
#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;
}
Fue sorprendentemente difícil "recoger" a todos los zombies llamando wait(2)
suficientes veces. Además, el número de señales SIGCHLD recibidas nunca es el mismo que el número de procesos secundarios bifurcados: creo que el kernel de Linux a veces envía 1 SIGCHLD para varios procesos secundarios salidos.
De todos modos, en mi computadora portátil Arch Linux, obtengo 16088 procesos secundarios bifurcados, y ese tiene que ser el número de zombis, ya que el programa no hace wait(2)
llamadas al sistema en el controlador de señal.
En mi servidor Slackware 12, obtengo 6076 procesos secundarios, que coinciden estrechamente con el valor de maxproc 6079
. Mi ID de usuario tiene otros 2 procesos en ejecución, sshd
y Zsh. Junto con la primera instancia no zombie del programa anterior que hace 6079.
La fork(2)
llamada al sistema falla con el error "Recurso no disponible temporalmente". No veo ninguna otra evidencia de qué recurso no está disponible. Obtengo números algo diferentes si ejecuto mi programa simultáneamente en 2 xterms diferentes, pero suman el mismo número que si lo ejecuto en un xterm. Supongo que es entradas de la tabla de proceso, o intercambio o algún recurso de todo el sistema, y no solo un límite arbitrario.
No tengo nada más en ejecución para probarlo ahora mismo.