मेरे पास HP-UX उपलब्ध नहीं है, और मैं कभी भी बड़ा HP-UX प्रशंसक नहीं रहा।
ऐसा प्रतीत होता है कि लिनक्स पर, प्रति-प्रक्रिया या शायद प्रति-उपयोगकर्ता सीमा पर कि कितने बच्चे प्रक्रिया मौजूद हैं। आप इसे 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 भेजता है।
वैसे भी, मेरे Arch linux लैपटॉप पर, मुझे 16088 चाइल्ड प्रॉसेस कांटेक्ट किए गए हैं, और जो कि लाश की संख्या होनी चाहिए, जैसा कि प्रोग्राम नहीं करता है wait(2)
सिग्नल हैंडलर में सिस्टम कॉल ।
मेरे स्लैकवेयर 12 सर्वर पर, मुझे 6076 बच्चे प्रक्रियाएं मिलती हैं, जो कि इसके मूल्य के साथ मेल खाती हैं maxproc 6079
। मेरी उपयोगकर्ता आईडी में 2 अन्य प्रक्रियाएं चल रही हैं,sshd
और Zsh। कार्यक्रम के पहले, गैर-ज़ोंबी उदाहरण के साथ-साथ यह 6079 बनाता है।
fork(2)
सिस्टम कॉल एक "संसाधन अस्थायी रूप से अनुपलब्ध" त्रुटि के साथ विफल। मुझे कोई अन्य सबूत नहीं दिखता कि क्या संसाधन उपलब्ध नहीं है। अगर मैं अपना प्रोग्राम 2 अलग-अलग xterms में एक साथ चलाता हूं, तो मुझे कुछ अलग नंबर मिलते हैं, लेकिन वे एक ही नंबर को जोड़ते हैं जैसे कि मैं इसे एक xterm में चलाता हूं। मुझे लगता है कि यह प्रक्रिया है टेबल एंट्रीज, या स्वैप या कुछ सिस्टम-वाइड संसाधन, और न केवल एक मनमानी सीमा।
मेरे पास अभी इसे चलाने के लिए कुछ और नहीं है।