Kullanabileceğim HP-UX yok ve asla büyük bir HP-UX hayranı olmadım.
Linux'ta, kaç alt işlem bulunduğuna ilişkin işlem başına veya belki kullanıcı başına bir sınır olduğu görülmektedir. limit
Yerleşik Zsh ile görebilirsiniz ( ulimit -u
bash ile benzer görünüyor ):
1002 % limit
cputime unlimited
filesize unlimited
datasize unlimited
stacksize 8MB
coredumpsize 0kB
memoryuse unlimited
maxproc 16136
...
Bir Arch linux dizüstü bilgisayarda.
Bu sınırı test etmek için küçük bir program yazdım:
#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)
Yeterli kez arayarak tüm zombi "toplamak" şaşırtıcı derecede zordu . Ayrıca, alınan SIGCHLD sinyallerinin sayısı hiçbir zaman çatallanan alt süreçlerin sayısı ile aynı değildir: Bence linux çekirdeği bazı çıkış işlemleri için bazen 1 SIGCHLD gönderir.
Her neyse, Arch linux dizüstü bilgisayarımda 16088 alt işlemin çatallandığını görüyorum ve program wait(2)
sinyal işleyicide sistem çağrıları yapmadığı için bu zombi sayısı olmalı .
Slackware 12 sunucumda değeri ile yakından eşleşen 6076 alt işlem alıyorum maxproc 6079
. Kullanıcı kimliğimde çalışan 2 işlem sshd
ve Zsh var. Yukarıdaki programın zombi olmayan ilk örneği ile birlikte 6079 yapar.
fork(2)
Sistem çağrısı bir "Kaynak geçici olarak kullanılamıyor" hatası ile başarısız olur. Hangi kaynağın mevcut olmadığına dair başka bir kanıt görmüyorum. Programımı aynı anda 2 farklı xterm'de çalıştırırsam biraz farklı sayılar alırım, ancak bir xterm'de çalıştırıyormuşum gibi aynı sayıya kadar eklerler. Ben sadece keyfi bir sınır değil, işlem tablosu girdileri, takas ya da bazı sistem çapında kaynak olduğunu varsayalım.
Şu anda denemek için çalışan başka bir şeyim yok.