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つの異なるxtermで同時にプログラムを実行すると、多少異なる数値が得られますが、1つのxtermで実行した場合と同じ数値になります。単なる任意の制限ではなく、プロセステーブルエントリ、スワップ、またはシステム全体のリソースであると想定しています。
私は今、それを試すために実行しているものは何も持っていません。