Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม C

วิธีการรันกระบวนการซอมบี้และเด็กกำพร้าในโปรแกรม C เดียว?


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