ในส่วนนี้ เราจะมาดูวิธีการรันกระบวนการซอมบี้และกระบวนการเด็กกำพร้าในโปรแกรมเดียวใน 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:~$