Nie mam dostępnego HP-UX i nigdy nie byłem wielkim fanem HP-UX.
Wygląda na to, że w Linuksie istnieje ograniczenie liczby procesów potomnych na proces lub użytkownika. Możesz to zobaczyć dzięki limit
wbudowanemu Zsh (wydaje się analogiczny jak ulimit -u
w bash):
1002 % limit
cputime unlimited
filesize unlimited
datasize unlimited
stacksize 8MB
coredumpsize 0kB
memoryuse unlimited
maxproc 16136
...
To na laptopie Arch Linux.
Napisałem mały program do przetestowania tego limitu:
#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;
}
Zaskakująco trudno było „zebrać” wszystkie zombie, dzwoniąc wait(2)
wystarczająco dużo razy. Ponadto liczba odebranych sygnałów SIGCHLD nigdy nie jest taka sama jak liczba rozwidlonych procesów potomnych: Wierzę, że jądro Linuksa czasami wysyła 1 SIGCHLD dla szeregu zakończonych procesów potomnych.
W każdym razie na moim laptopie Arch Linux, rozwidlam procesy potomne 16088, a to musi być liczba zombie, ponieważ program nie wykonuje wait(2)
wywołań systemowych w module obsługi sygnału.
Na moim serwerze Slackware 12 otrzymuję 6076 procesów potomnych, co ściśle odpowiada wartości maxproc 6079
. Mój identyfikator użytkownika ma uruchomione 2 inne procesy sshd
i Zsh. Wraz z pierwszą instancją programu innego niż zombie powyżej, która tworzy 6079.
fork(2)
Wywołanie awarii systemu z „Zasoby chwilowo niedostępny” błędu. Nie widzę żadnych innych dowodów wskazujących, który zasób jest niedostępny. Otrzymuję nieco inne liczby, jeśli uruchamiam mój program jednocześnie w 2 różnych xtermach, ale sumują się one do tej samej liczby, jak gdybym uruchamiał go w jednym xtermie. Zakładam, że są to wpisy w tabeli procesów, swap lub jakiś systemowy zasób, a nie tylko arbitralny limit.
Nie mam już nic innego do przetestowania.