2014-09-25 12 views
5

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?

+0

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. –

+0

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

Trả lời

7

Quy trình con đã thoát vẫn còn trong bảng xử lý dưới dạng zombie. Các quy trình Zombie tồn tại cho đến khi cha mẹ gọi wait hoặc waitpid để có trạng thái thoát. Ngoài ra, id quá trình tương ứng được giữ lại, để ngăn chặn các quá trình sao chép mới khác được tạo ra.

Trong trường hợp của bạn, bảng xử lý quá lớn và hệ thống từ chối việc tạo các quy trình mới.

Quy trình phân nhánh và sau đó không truy xuất trạng thái thoát của chúng có thể được coi là rò rỉ tài nguyên. Khi cha mẹ thoát, họ sẽ được thông qua bởi quá trình init và sau đó gặt hái, nhưng nếu cha mẹ vẫn còn sống quá lâu, không có cách nào cho hệ thống để chỉ cần loại bỏ một số zombie, bởi vì nó được giả định rằng cha mẹ nên quan tâm đến họ tại một số thời điểm qua wait hoặc waitpid.

1

Quy trình con cũng giữ một số tài nguyên như bộ nhớ. Nhưng chúng không được giải phóng vì quá trình cha không thể xử lý tín hiệu SIGCHLD, mà sẽ được gửi bởi các tiến trình con khi chúng thoát ra.

Các quy trình con đó sẽ trở thành zombie.

Bạn có thể sử dụng "ps -aux" để loại bỏ các fd đó.

Các vấn đề liên quan