2013-06-10 31 views
13

Tôi đang viết một máy chủ sử dụng fork() để tạo trình xử lý cho các kết nối máy khách. Các máy chủ không cần phải biết về những gì xảy ra với các quá trình chia hai - họ làm việc trên của riêng mình, và khi họ đang thực hiện, họ chỉ nên chết thay vì trở thành zombie. Một cách dễ dàng để thực hiện điều này là gì?Làm cách nào để ngăn chặn các quá trình con của zombie?

+1

này, có lẽ, là cách dễ nhất: http://stackoverflow.com/questions/7171722/how-can-i-handle-sigchld-in-c/7171836 # 7171836 – andrewsh

+0

@andrewsh Ồ, thật tuyệt. Bạn có nghĩ rằng các câu hỏi tương tự đủ để gắn cờ câu hỏi này là trùng lặp không? – thejh

Trả lời

11

Có một số cách, nhưng sử dụng sigaction với SA_NOCLDWAIT trong quá trình cha mẹ có lẽ là đơn giản nhất:

struct sigaction sigchld_action = { 
    .sa_handler = SIG_DFL, 
    .sa_flags = SA_NOCLDWAIT 
}; 
sigaction(SIGCHLD, &sigchld_action, NULL); 
+0

Thậm chí dễ dàng hơn: 'tín hiệu (SIGCHLD, SIG_IGN);' – domsson

5

Dùng dĩa kép. Cho con bạn ngay lập tức nĩa một bản sao khác và có lối ra của quá trình con ban đầu.

http://thinkiii.blogspot.com/2009/12/double-fork-to-avoid-zombie-process.html

Đây là đơn giản hơn so với sử dụng các tín hiệu, theo ý kiến ​​của tôi, và dễ hiểu hơn.

void safe_fork() 
{ 
    pid_t pid; 
    if (!pid=fork()) { 
    if (!fork()) { 
     /* this is the child that keeps going */ 
     do_something(); /* or exec */ 
    } else { 
     /* the first child process exits */ 
     exit(0); 
    } 
    } else { 
    /* this is the original process */ 
    /* wait for the first child to exit which it will immediately */ 
    waitpid(pid); 
    } 
} 
+3

Tuy nhiên, nếu ai đó muốn nhìn thấy một cây quá trình hoặc một cái gì đó như thế, điều này sẽ mess nó lên, phải không? – thejh

+0

Không chắc chắn, nhưng có vẻ như vậy. – xaxxon

+0

Trên hệ thống POSIX, cha mẹ của đứa trẻ sẽ được thay đổi thành INIT (PID = 1), vì vậy, cây quá trình sẽ không phải là những gì bạn có thể mong đợi – Nick

0

Làm cách nào để loại bỏ các quy trình zombie?

bạn không thể giết quá trình zombie bằng tín hiệu SIGKILL khi bạn giết quá trình bình thường, Vì quá trình zombie không thể thu hồi bất kỳ tín hiệu nào. để có một thói quen tốt là rất quan trọng.

Sau đó, khi lập trình, cách loại bỏ số lượng quy trình zombie? Theo mô tả ở trên, tiến trình con sẽ gửi tín hiệu SIGCHLD đến tiến trình cha khi nó chết. theo mặc định, tín hiệu này bị bỏ qua bởi hệ thống, vì vậy cách tốt nhất là chúng ta có thể gọi wait() trong hàm xử lý tín hiệu, có thể tránh được thanh zombie xung quanh trong hệ thống. xem chi tiết về vấn đề này: http://itsprite.com/how-to-deep-understand-the-zombie-process-in-linux/

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