Trong phần này, chúng ta sẽ thấy cách thực thi quá trình zombie và quá trình mồ côi trong một chương trình duy nhất bằng C / C ++. Trước khi đi vào cuộc thảo luận chính, chúng ta hãy xem quá trình xác sống và quá trình mồ côi là gì.
Quá trình xác sống
Quá trình zombie là một quá trình mà quá trình thực thi đã hoàn tất nhưng nó vẫn có một mục trong bảng quá trình. Các quy trình xác sống thường xảy ra đối với các quy trình con, vì quy trình mẹ vẫn cần đọc trạng thái thoát của quy trình con của nó. Khi điều này được thực hiện bằng cách sử dụng lệnh gọi hệ thống chờ, quá trình zombie sẽ bị loại bỏ khỏi bảng quá trình. Điều này được gọi là thu hoạch quá trình thây ma.
Quá trình mồ côi
Các quy trình mồ côi là những quy trình vẫn đang chạy mặc dù quy trình mẹ của chúng đã kết thúc hoặc kết thúc. Một quy trình có thể bị bỏ sót một cách cố ý hoặc vô ý.
Một quy trình cố ý chạy trong nền mà không có bất kỳ hỗ trợ thủ công nào. Điều này thường được thực hiện để bắt đầu một dịch vụ đang chạy vô thời hạn hoặc để hoàn thành một công việc đang chạy trong thời gian dài mà người dùng không chú ý.
Một quy trình không chủ ý được tạo ra khi quy trình mẹ của nó bị treo hoặc kết thúc. Có thể tránh các quy trình mồ côi không chủ ý bằng cách sử dụng cơ chế nhóm quy trình.
Bây giờ trong đoạn mã sau, chúng ta sẽ thực hiện đồng thời quá trình zombie và orphan. Ở đây chúng ta có một tiến trình cha mẹ, nó có một đứa trẻ, và đứa trẻ này có một đứa trẻ khác. Nếu điều khiển của chúng tôi chèn vào quy trình con, thì chúng tôi sẽ dừng quá trình thực thi trong 5 giây để nó có thể kết thúc quy trình mẹ. Do đó quá trình trẻ em trở thành quá trình mồ côi. Sau đó tiến trình cháu sẽ được chuyển thành tiến trình Zombie. Đứa cháu kết thúc quá trình thực thi khi cha mẹ của nó (con của tiến trình chính) ngủ trong 1 giây. Do đó, tiến trình cháu không gọi là kết thúc và mục nhập của nó sẽ ở đó trong bảng quy trình.
Mã mẫu
#include <stdio.h> #include <unistd.h> int main() { int x = fork(); //create child process if (x > 0) //if x is non zero, then it is parent process printf("Inside Parent---- PID is : %d\n", getpid()); else if (x == 0) { //for chile process x will be 0 sleep(5); //wait for some times x = fork(); if (x > 0) { printf("Inside Child---- PID :%d and PID of parent : %d\n", getpid(), getppid()); while(1) sleep(1); printf("Inside Child---- PID of parent : %d\n", getppid()); }else if (x == 0) printf("Inside grandchild process---- PID of parent : %d\n", getppid()); } return 0; }
Đầu ra
soumyadeep@soumyadeep-VirtualBox:~$ ./a.out Inside Parent---- PID is : 3821 soumyadeep@soumyadeep-VirtualBox:~$ Inside Child---- PID :3822 and PID of parent : 686 Inside grandchild process---- PID of parent : 3822 soumyadeep@soumyadeep-VirtualBox:~$