Saya tidak memiliki HP-UX yang tersedia untuk saya, dan saya tidak pernah menjadi penggemar HP-UX yang besar.
Tampaknya di Linux, batas per proses atau mungkin per pengguna pada berapa banyak proses anak ada. Anda dapat melihatnya dengan limit
Zsh built-in (tampaknya analog dengan ulimit -u
bash):
1002 % limit
cputime unlimited
filesize unlimited
datasize unlimited
stacksize 8MB
coredumpsize 0kB
memoryuse unlimited
maxproc 16136
...
Itu ada di laptop Arch linux.
Saya menulis sebuah program kecil untuk menguji batas itu:
#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;
}
Secara mengejutkan sulit untuk "mengumpulkan" semua zombie dengan memanggil wait(2)
waktu yang cukup. Juga, jumlah sinyal SIGCHLD yang diterima tidak pernah sama dengan jumlah proses anak bercabang: Saya percaya kernel linux kadang-kadang mengirimkan 1 SIGCHLD untuk sejumlah proses anak yang sudah keluar.
Bagaimanapun, pada laptop Arch linux saya, saya mendapatkan proses anak 16088 bercabang, dan itu harus menjadi jumlah zombie, karena program tidak melakukan wait(2)
panggilan sistem dalam penangan sinyal.
Di server Slackware 12 saya, saya mendapatkan 6076 proses anak, yang sangat cocok dengan nilai maxproc 6079
. ID pengguna saya memiliki 2 proses lain yang berjalan, sshd
dan Zsh. Seiring dengan contoh pertama, non-zombie dari program di atas yang membuat 6079.
The fork(2)
system call gagal dengan "Resource sementara tidak tersedia" kesalahan. Saya tidak melihat bukti lain dari sumber daya apa yang tidak tersedia. Saya mendapatkan angka yang agak berbeda jika saya menjalankan program saya secara bersamaan dalam 2 xterms berbeda, tetapi mereka menambahkan ke nomor yang sama seperti jika saya menjalankannya dalam satu xterm. Saya menganggap itu entri tabel proses, atau swap atau sumber daya seluruh sistem, dan bukan hanya batas yang sewenang-wenang.
Saya tidak punya hal lain yang berjalan untuk mencobanya sekarang.