ในส่วนนี้ เราจะมาดูวิธีการรันกระบวนการซอมบี้และกระบวนการเด็กกำพร้าในโปรแกรมเดียวใน C/C++ ก่อนเข้าสู่การสนทนาหลัก เรามาดูว่ากระบวนการซอมบี้และกระบวนการเด็กกำพร้าคืออะไร
กระบวนการซอมบี้
กระบวนการซอมบี้เป็นกระบวนการที่การดำเนินการเสร็จสิ้น แต่ก็ยังมีรายการในตารางกระบวนการ กระบวนการซอมบี้มักจะเกิดขึ้นสำหรับกระบวนการลูก เนื่องจากกระบวนการหลักยังคงต้องอ่านสถานะการออกของลูก เมื่อเสร็จสิ้นโดยใช้การเรียกระบบรอ กระบวนการซอมบี้จะถูกลบออกจากตารางกระบวนการ สิ่งนี้เรียกว่าการเก็บเกี่ยวกระบวนการซอมบี้
กระบวนการเด็กกำพร้า
กระบวนการกำพร้าคือกระบวนการที่ยังคงทำงานอยู่แม้ว่ากระบวนการหลักจะสิ้นสุดหรือเสร็จสิ้น กระบวนการสามารถกำพร้าโดยเจตนาหรือไม่ตั้งใจ
กระบวนการกำพร้าโดยเจตนาทำงานในพื้นหลังโดยไม่มีการสนับสนุนด้วยตนเอง โดยปกติแล้วจะทำเพื่อเริ่มบริการที่รันอยู่ไม่มีกำหนดหรือเพื่อทำงานระยะยาวให้เสร็จโดยที่ผู้ใช้ไม่สนใจ
กระบวนการที่ถูกละเลยโดยไม่ได้ตั้งใจจะถูกสร้างขึ้นเมื่อกระบวนการหลักล้มเหลวหรือยุติลง สามารถหลีกเลี่ยงกระบวนการเด็กกำพร้าที่ไม่ได้ตั้งใจได้โดยใช้กลไกกลุ่มกระบวนการ
ในรหัสต่อไปนี้ เราจะดำเนินการกระบวนการซอมบี้และเด็กกำพร้าพร้อมๆ กัน ที่นี่เรามีกระบวนการผู้ปกครอง มีลูก และเด็กคนนี้มีลูกอีกคน หากการควบคุมของเราแทรกเข้าไปในกระบวนการย่อย เราจะหยุดการดำเนินการเป็นเวลา 5 วินาที เพื่อให้กระบวนการหลักเสร็จสิ้น ดังนั้นกระบวนการลูกจึงกลายเป็นกระบวนการกำพร้า หลังจากนั้นกระบวนการหลานจะถูกแปลงเป็นกระบวนการซอมบี้ หลานดำเนินการเสร็จสิ้นเมื่อผู้ปกครอง (ลูกของกระบวนการหลัก) หลับเป็นเวลา 1 วินาที ดังนั้นกระบวนการหลานจึงไม่เรียกยุติ และรายการจะอยู่ที่นั่นในตารางกระบวนการ
โค้ดตัวอย่าง
#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; }
ผลลัพธ์
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:~$