Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Số tiến trình Zombie tối đa hệ thống có thể xử lý trong C++

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ặp while.
  • 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ặp fork() > 0). Con trở thành Zombie vì cha không gọi wait().
  • Biến num đếm số lần fork() 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ện fork() > 0 sai, 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).