Non ho HP-UX disponibile per me e non sono mai stato un grande fan di HP-UX.
Sembra che su Linux, un limite per processo o forse per utente su quanti processi figlio esistano. Puoi vederlo con limit
Zsh integrato (sembra essere analogo a ulimit -u
in bash):
1002 % limit
cputime unlimited
filesize unlimited
datasize unlimited
stacksize 8MB
coredumpsize 0kB
memoryuse unlimited
maxproc 16136
...
È su un laptop Arch Linux.
Ho scritto un piccolo programma per testare quel 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;
}
È stato sorprendentemente difficile "collezionare" tutti gli zombi chiamando wait(2)
abbastanza volte. Inoltre, il numero di segnali SIGCHLD ricevuti non è mai uguale al numero di processi figlio biforcati: credo che il kernel Linux a volte mandi 1 SIGCHLD per un numero di processi figlio usciti.
Ad ogni modo, sul mio laptop Arch Linux, ottengo 16088 processi secondari biforcati, e questo deve essere il numero di zombi, poiché il programma non esegue wait(2)
chiamate di sistema nel gestore del segnale.
Sul mio server Slackware 12, ottengo 6076 processi figlio, che corrispondono strettamente al valore di maxproc 6079
. Il mio ID utente ha altri 2 processi in esecuzione sshd
e Zsh. Insieme alla prima istanza non zombi del programma sopra che fa 6079.
La fork(2)
chiamata di sistema ha esito negativo con un errore "Risorsa temporaneamente non disponibile". Non vedo altre prove di quale risorsa non sia disponibile. Ottengo numeri leggermente diversi se eseguo il mio programma contemporaneamente in 2 xterm diversi, ma si sommano allo stesso numero come se lo avessi eseguito in un xterm. Presumo che sia voci della tabella dei processi, o swap o qualche risorsa a livello di sistema, e non solo un limite arbitrario.
Non ho nient'altro in esecuzione per provarlo adesso.