Câu trả lời:
Quá trình zombie đã chết. Bạn không thể giết chúng. Các kill
lệnh hoặc hệ thống gọi không ảnh hưởng đến quá trình zombie. (Bạn có thể khiến zombie biến mất kill
, nhưng bạn phải bắn cha mẹ, không phải zombie, như chúng ta sẽ thấy trong một phút.)
Một quá trình zombie không thực sự là một quá trình, nó chỉ là một mục trong bảng quy trình. Không có tài nguyên nào khác liên quan đến quá trình zombie: nó không có bất kỳ bộ nhớ hoặc bất kỳ mã đang chạy nào, nó không giữ bất kỳ tệp nào mở, v.v.
Khi một quá trình chết, điều cuối cùng sẽ xảy ra, sau khi tất cả các tài nguyên khác được dọn sạch, là mục trong bảng quy trình. Mục nhập này được giữ xung quanh, tạo thành một thây ma, để cho phép quá trình cha mẹ theo dõi trạng thái thoát của trẻ. Phụ huynh đọc trạng thái thoát bằng cách gọi một trong các wait
gia đình của tòa nhà; tại thời điểm này, zombie biến mất. Gọi điện wait
được cho là để gặt hái đứa trẻ, mở rộng phép ẩn dụ của một thây ma đã chết nhưng theo một cách nào đó vẫn chưa được xử lý hoàn toàn sang thế giới bên kia. Phụ huynh cũng có thể chỉ ra rằng nó không quan tâm (bằng cách bỏ qua tín hiệu SIGCHLD hoặc bằng cách gọi sigaction
với SA_NOCLDWAIT
cờ), trong trường hợp đó, mục trong bảng quy trình sẽ bị xóa ngay lập tức khi đứa trẻ chết.
Do đó, zombie chỉ tồn tại khi một quá trình đã chết và cha mẹ của nó chưa được gọi wait
. Trạng thái này chỉ có thể tồn tại chừng nào cha mẹ vẫn đang chạy. Nếu cha mẹ chết trước khi đứa trẻ hoặc chết mà không đọc trạng thái của con, quy trình cha mẹ của zombie được đặt thành quy trình với PID 1 init
. Một trong những công việc của init
là gọi wait
một vòng lặp và do đó gặt hái bất kỳ quá trình zombie nào bị bỏ lại bởi cha mẹ của nó.
Bạn không phải kill
là một quá trình zombie, vì nó đã chết.
Quá trình zombie phải được chỉnh sửa wait
bởi cha mẹ của chúng, để thu thập trạng thái thoát của chúng.
"Cơ chế dọn dẹp tích hợp" duy nhất có trong Linux, hoạt động trong trường hợp bất kỳ quy trình cha mẹ nào cũng chết trước khi nó thu thập trạng thái thoát của con cái nó. Trong trường hợp này, mỗi đứa trẻ được kế thừa bởi init
quá trình, nó sẽ wait
trên đứa trẻ, thu thập trạng thái thoát của nó và loại bỏ mục nhập của nó trong bảng quy trình.
Ngay khi cha mẹ của một quá trình chết đi, quá trình đó trở thành một đứa trẻ mồ côi - không quan tâm đến việc nó có phải là zombie hay không. Điều gì xảy ra với trẻ mồ côi? Họ nhận được một cha mẹ mới, được gọi init
. init
sẽ wait
trên mỗi đứa trẻ mồ côi mà nó thu thập được, do đó gặt hái được đứa trẻ mồ côi (đó cũng có thể là một thây ma).
Không, không có cơ chế làm sạch tích hợp cho zombie. Zombie đến thiên đường zombie một khi cha mẹ của chúng bị giết. Cho đến lúc đó, HĐH giữ cho họ trả lại trạng thái thoát cho cha mẹ.
init
không giết bất kỳ quá trình. Nó chỉwait
s trên con của nó để thu thập trạng thái của họ.