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?
Trả lời
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);
}
}
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
Không chắc chắn, nhưng có vẻ như vậy. – xaxxon
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
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/
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
@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