Prerrequisito: Procesos Zombie y Huérfano en C
Proceso zombi:
un proceso zombi es un proceso que ha completado la ejecución pero aún tiene una entrada en la tabla de procesos. Esta entrada aún es necesaria para permitir que el proceso principal lea el estado de salida de su hijo.
Un proceso que finaliza no puede abandonar el sistema hasta que su padre acepte su código de retorno. Si su proceso principal ya está muerto, ya habrá sido adoptado por el proceso «init», que siempre acepta los códigos de retorno de sus hijos. Sin embargo, si el padre de un proceso está activo pero nunca ejecuta una espera ( ), el código de retorno del proceso nunca se aceptará y el proceso seguirá siendo un zombi.
Proceso huérfano:
un proceso huérfano es un proceso que aún se está ejecutando, pero cuyo padre ha muerto. No se convierten en procesos zombies; en su lugar, son adoptados por init (ID de proceso 1), que espera a sus hijos.
Cuando un padre muere antes que su hijo, el hijo es adoptado automáticamente por el proceso «init» original cuyo PID es 1.
Enfoque:
en el siguiente código, hemos creado un escenario en el que hay un padre y tiene un hijo y ese hijo también tiene un hijo, en primer lugar, si nuestro proceso entra en proceso hijo, ponemos nuestro sistema en suspensión durante 5 segundos para que Podríamos terminar el proceso principal para que su hijo quede huérfano, luego hemos hecho que el hijo de un hijo sea un proceso zombie, el hijo del hijo termina su ejecución mientras el padre (es decir, el hijo) duerme durante 1 segundo, por lo tanto, el hijo del hijo no llamada a terminar, y su entrada aún existe en la tabla de procesos.
A continuación se muestra la implementación del enfoque anterior:
// C program to execute zombie and // orphan process in a single program #include <stdio.h> int main() { int x; x = fork(); if (x > 0) printf("IN PARENT PROCESS\nMY PROCESS ID : %d\n", getpid()); else if (x == 0) { sleep(5); x = fork(); if (x > 0) { printf("IN CHILD PROCESS\nMY PROCESS ID :%d\n PARENT PROCESS ID : %d\n", getpid(), getppid()); while(1) sleep(1); printf("IN CHILD PROCESS\nMY PARENT PROCESS ID : %d\n", getppid()); } else if (x == 0) printf("IN CHILD'S CHILD PROCESS\n MY PARENT ID : %d\n", getppid()); } return 0; }
Salida:
Nota: Es posible que el código anterior no funcione con el compilador en línea ya que fork() está deshabilitado.
Publicación traducida automáticamente
Artículo escrito por anamika9988 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA