Tôi đã viết chương trình sau đây để hiểu cách thức hoạt động của fork khi được gọi mà không phải chờ() hoặc waitpid().Linux Fork: pid reuse
int main()
{
pid_t childpid;
int retval = 0;
int i;
while(1){
//usleep(1);
childpid = fork();
if (childpid >= 0)
{
i++;
if (childpid == 0)
{
exit(retval);
}
else
{
//printf("childpid is %d\n", childpid);
}
}
else
{
printf("total no. of processes created = %d\n", i);
perror("fork");
exit(0);
}
}
}
Dưới đây là kết quả tôi GET>
total no. of processes created = 64901
fork: Cannot allocate memory
tôi mong đợi chương trình để tiếp tục như tôi thoát khỏi quá trình đứa trẻ ngay lập tức và fork() nên tái sử dụng PID sau pid> pid_max. Tại sao điều này không xảy ra?
Tôi rất ngạc nhiên khi bạn không hoàn toàn làm hỏng hệ thống của mình. Thông thường, có giới hạn quy trình người dùng để tránh loại hành vi và bom ngã ba này. 'ulimit -u' sẽ cho bạn một giới hạn quá trình rất lớn trên hệ thống của bạn. đây là một lỗ hổng lớn trong hệ thống của bạn. –
ulimit -u tiết lộ: 31488. Như một vấn đề của thực tế, chương trình thậm chí chạy trên những nỗ lực tiếp theo. – Zaxter