У меня нет HP-UX, и я никогда не был большим поклонником HP-UX.
Похоже, что в Linux существует ограничение на количество дочерних процессов для каждого процесса или, возможно, для каждого пользователя. Вы можете увидеть это с помощью limit
встроенного Zsh (похоже, ulimit -u
в bash):
1002 % limit
cputime unlimited
filesize unlimited
datasize unlimited
stacksize 8MB
coredumpsize 0kB
memoryuse unlimited
maxproc 16136
...
Это на ноутбуке Arch Linux.
Я написал небольшую программу для проверки этого ограничения:
#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;
}
Было удивительно трудно «собрать» всех зомби, позвонив wait(2)
достаточно раз. Кроме того, количество полученных сигналов SIGCHLD никогда не совпадает с числом разветвленных дочерних процессов: я полагаю, что ядро linux иногда отправляет 1 SIGCHLD для ряда завершенных дочерних процессов.
В любом случае, на моем ноутбуке Arch Linux я получил 16088 дочерних процессов, и это должно быть количество зомби, так как программа не выполняет wait(2)
системные вызовы в обработчике сигналов.
На моем сервере Slackware 12 я получаю 6076 дочерних процессов, что близко соответствует значению maxproc 6079
. У моего ID пользователя есть еще 2 запущенных процесса sshd
и Zsh. Наряду с первым, не зомби-экземпляром программы выше, это 6079.
fork(2)
Системный вызов не с «Ресурс временно недоступна» ошибка. Я не вижу никаких других доказательств того, что ресурс недоступен. Я получаю несколько разные числа, если я запускаю свою программу одновременно в 2 разных xterms, но они складываются в одно и то же число, как если бы я запускал ее в одном xterm. Я предполагаю, что это записи таблицы процессов, или подкачка, или какой-то общесистемный ресурс, а не просто произвольный предел.
У меня больше ничего нет, чтобы попробовать это прямо сейчас.