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/
- 1. Làm cách nào để ngăn chặn hộp thoại Báo cáo Lỗi của Microsoft khi một quá trình con bị treo
- 2. Erlang. cách chính xác để ngăn chặn quá trình
- 3. Xóa các quá trình zombie bằng gói song song
- 4. Làm thế nào để ngăn chặn quá trình java một cách duyên dáng?
- 5. Làm thế nào để ngăn chặn python từ truyền tín hiệu đến các quy trình con?
- 6. Leiningen - làm thế nào để giết quá trình con?
- 7. Làm thế nào để ngăn chặn một quá trình sinh sản nhiều đứa trẻ hơn
- 8. Ngăn chặn các quá trình thực thi các cuộc gọi hệ thống nhất định
- 9. Làm cách nào để tránh zombie trong các tập lệnh Perl CGI chạy dưới Apache 1.3?
- 10. Có cách nào để ngăn chặn quá trình lập chỉ mục Magento không?
- 11. Làm thế nào để ngăn chặn MigLayout từ vượt quá giới hạn của một thùng chứa
- 12. Ngăn chặn nhiều cá thể quá trình trên Linux
- 13. Quá trình Zombie xuất hiện Khi tôi sinh ra quy trình
- 14. Ngăn chặn quá trình bị giết trong C#?
- 15. Quy trình Zombie
- 16. Làm cách nào để ngăn chặn cảnh báo (toàn bộ mã) trong quá trình biên dịch javadoc?
- 17. Làm cách nào để ngăn chặn sự điên rồ của khỉ?
- 18. Cách tốt nhất để ngăn chặn quá trình Unicorn Server chạy là gì?
- 19. Cách tốt hơn để ngăn chặn bộ nhớ đệm của trình duyệt của các tệp JavaScript
- 20. Làm cách nào để ngăn chặn các cảnh báo về mã chết của Eclipse 3.5
- 21. Làm cách nào để ngăn chặn việc xóa phụ huynh nếu có hồ sơ con?
- 22. Làm cách nào để ngăn chặn lựa chọn văn bản/phần tử khi kéo con trỏ
- 23. Làm cách nào để ngăn chặn các quy trình java dòng lệnh khỏi lấy cắp tiêu điểm trong OSX?
- 24. Làm thế nào để ngăn chặn chuột nhập/xuất hiện quá nhiều lần
- 25. Làm cách nào để ngăn chặn di chuyển con lăn chuột cửa sổ ...?
- 26. Laravel & PHPUnit: cho phép quá trình cách ly để ngăn chặn Mysql Quá nhiều lỗi kết nối
- 27. C++, ngăn chặn cá thể lớp được tạo trên ngăn xếp (trong quá trình biên dịch)
- 28. Làm cách nào để ngăn chặn cảnh báo StyleCop SA1403?
- 29. Làm cách nào để ngăn chặn os.walk của Python đi qua các điểm gắn kết?
- 30. Làm cách nào để ngăn chặn PerlTidy sắp xếp các bài tập của tôi?
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