ฉันไม่ได้มี HP-UX ให้ฉันและฉันไม่เคยเป็นแฟนตัวยงของ HP-UX
ปรากฏว่าบน Linux ขีด จำกัด ต่อกระบวนการหรืออาจ จำกัด ต่อผู้ใช้ในจำนวนกระบวนการลูกที่มีอยู่ คุณสามารถดูได้ด้วยlimit
Zsh ในตัว (ดูเหมือนจะคล้ายกับulimit -u
ทุบตี):
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)
เรียกระบบในตัวจัดการสัญญาณ
เมื่อวันที่ 12 Slackware เซิร์ฟเวอร์ของฉันฉันจะได้รับ 6076 maxproc 6079
กระบวนการที่เด็กซึ่งใกล้เคียงกับค่าของ ID ผู้ใช้ของฉันมี 2 กระบวนการอื่นกำลังทำงานอยู่sshd
และ Zsh พร้อมด้วยอินสแตนซ์แรกที่ไม่ใช่ซอมบี้ของโปรแกรมด้านบนที่สร้าง 6079
fork(2)
เรียกระบบล้มเหลวโดยมีข้อผิดพลาด "ทรัพยากรไม่พร้อมใช้งานชั่วคราว" ฉันไม่เห็นหลักฐานอื่น ๆ ว่าทรัพยากรใดไม่พร้อมใช้งาน ฉันจะได้รับตัวเลขที่แตกต่างกันบ้างถ้าฉันรันโปรแกรมพร้อมกันใน xterms ที่ต่างกัน 2 ตัว แต่พวกมันจะรวมกันเป็นจำนวนเดียวกันเหมือนกับว่าฉันรันมันในหนึ่ง xterm ฉันคิดว่ามันเป็นรายการตารางกระบวนการหรือแลกเปลี่ยนหรือทรัพยากรทั่วทั้งระบบและไม่ได้เป็นเพียงข้อ จำกัด โดยพลการ
ฉันไม่ได้ลองทำอะไรอีกเลยในตอนนี้