У мене немає 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
і ЗШ. Поряд із першим екземпляром програми, що не є зомбі, вище 6079.
fork(2)
Системний виклик не з «Ресурс тимчасово недоступна» помилка. Я не бачу інших доказів того, який ресурс недоступний. Я отримую дещо інші цифри, якщо запускаю свою програму одночасно у двох різних xterms, але вони додають до того ж числа, як якщо б я запускав її в одному xterm. Я припускаю, що це записи таблиць процесів, або своп, або якийсь загальносистемний ресурс, а не просто довільне обмеження.
У мене нічого більше не працює, щоб спробувати це зараз.