나는 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
...
아치 리눅스 노트북에 있습니다.
그 한계를 테스트하는 작은 프로그램을 작성했습니다.
#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 신호의 수는 분기 된 자식 프로세스 수와 동일하지 않습니다. 나는 리눅스 커널이 때때로 종료 된 자식 프로세스 수에 대해 1 개의 SIGCHLD를 보냅니다.
어쨌든 내 아치 리눅스 랩톱에서 16088 개의 자식 프로세스가 분기되며 프로그램이 wait(2)
신호 처리기에서 시스템 호출을 수행하지 않기 때문에 좀비 수 여야 합니다.
내 Slackware 12 서버에서의 값과 거의 일치하는 6076 개의 자식 프로세스를 얻습니다 maxproc 6079
. 내 사용자 ID에는 2 개의 다른 프로세스가 실행 중이며 sshd
Zsh가 있습니다. 위의 프로그램의 첫 번째, 좀비가 아닌 인스턴스와 함께 6079를 만듭니다.
fork(2)
시스템 호출은 "자원 일시적으로 사용할 수 없습니다"오류와 함께 실패합니다. 어떤 리소스를 사용할 수 없는지에 대한 다른 증거는 없습니다. 프로그램을 2 개의 다른 xterm에서 동시에 실행하면 약간 다른 숫자가 표시되지만 하나의 xterm에서 실행하는 것과 같은 숫자가됩니다. 프로세스 테이블 항목 또는 스왑 또는 시스템 전체 리소스이며 임의의 제한이 아니라고 가정합니다.
지금 시도해 볼만한 것이 없습니다.