Tôi không có sẵn HP-UX và tôi chưa bao giờ là một fan hâm mộ HP-UX lớn.
Dường như trên Linux, giới hạn cho mỗi quá trình hoặc có thể cho mỗi người dùng về số lượng quy trình con tồn tại. Bạn có thể thấy nó với limit
Zsh tích hợp (dường như tương tự như ulimit -u
trong bash):
1002 % limit
cputime unlimited
filesize unlimited
datasize unlimited
stacksize 8MB
coredumpsize 0kB
memoryuse unlimited
maxproc 16136
...
Đó là trên một máy tính xách tay Arch linux.
Tôi đã viết một chương trình nhỏ để kiểm tra giới hạn đó:
#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;
}
Thật khó để "thu thập" tất cả các thây ma bằng cách gọi wait(2)
đủ số lần. Ngoài ra, số lượng tín hiệu SIGCHLD nhận được không bao giờ bằng số lượng tiến trình con được chia rẽ: Tôi tin rằng nhân linux đôi khi gửi 1 SIGCHLD cho một số tiến trình con đã thoát.
Dù sao, trên máy tính xách tay Arch linux của tôi, tôi có 16088 tiến trình con được chia rẽ và đó phải là số lượng zombie, vì chương trình không thực hiện wait(2)
các cuộc gọi hệ thống trong trình xử lý tín hiệu.
Trên máy chủ Slackware 12 của tôi, tôi nhận được 6076 tiến trình con, rất khớp với giá trị của maxproc 6079
. ID người dùng của tôi có 2 tiến trình khác đang chạy sshd
và Zsh. Cùng với phiên bản đầu tiên, không phải zombie của chương trình trên tạo ra 6079.
Cuộc fork(2)
gọi hệ thống không thành công với lỗi "Tài nguyên tạm thời không khả dụng". Tôi không thấy bất kỳ bằng chứng nào khác về tài nguyên nào không có sẵn. Tôi nhận được một số số khác nhau nếu tôi chạy chương trình của mình đồng thời ở 2 xterms khác nhau, nhưng chúng cộng với cùng một số như thể tôi chạy nó trong một xterm. Tôi giả sử đó là quá trình nhập bảng, hoặc trao đổi hoặc một số tài nguyên trên toàn hệ thống và không chỉ là giới hạn tùy ý.
Tôi không có gì khác để chạy thử ngay bây giờ.