Tiến trình Zombie (tiến trình ma) là tiến trình đã kết thúc (gọi exit()) nhưng vẫn còn mục trong bảng tiến trình vì tiến trình cha chưa đọc mã thoát của nó (chưa gọi wait()).
Chương trình dưới đây tìm số tiến trình Zombie tối đa mà hệ thống cho phép tạo ra trước khi không thể fork() thêm (trả về lỗi).
Code C++ (Linux/Unix)
#include <iostream>
#include <unistd.h> // fork()
using namespace std;
int main() {
int num = 0;
// fork() trả về PID con cho cha, 0 cho con, -1 nếu lỗi
// Cha tiếp tục vòng lặp (fork() > 0), con thoát ngay (không in, không fork thêm)
while (fork() > 0) {
num++;
cout << num << ' ';
}
return 0;
}
Giải thích
- Tiến trình cha gọi
fork()liên tục trong vòng lặpwhile. - Mỗi lần
fork()thành công, tiến trình con được tạo ra và thoát ngay (vì không vào vòng lặpfork() > 0). Con trở thành Zombie vì cha không gọiwait(). - Biến
numđếm số lầnfork()thành công của cha. - Khi hệ thống hết slot tiến trình,
fork()trả về -1, điều kiệnfork() > 0sai, vòng lặp dừng.
Kết quả mẫu
1 2 3 ... 93 (số này thay đổi tùy cấu hình hệ thống: ulimit, PID max, RAM...)
Lưu ý quan trọng
- Chương trình này tạo ra nhiều tiến trình Zombie → có thể làm treo hệ thống hoặc đạt giới hạn tiến trình của user (
ulimit -u). - Chỉ chạy để mục đích học tập/minh họa. Cần dọn dẹp sau khi chạy (reboot hoặc kill cha).
- C++ chuẩn không hỗ trợ
fork(); đây là API POSIX (Linux/macOS).