En los sistemas operativos de computadora , un proceso (o tarea ) puede esperar a otro proceso para completar su ejecución. En la mayoría de los sistemas, un proceso padre puede crear un proceso hijo de ejecución independiente . El proceso padre puede emitir una llamada al sistema de espera , que suspende la ejecución del proceso padre mientras se ejecuta el hijo. Cuando el proceso hijo termina, devuelve un estado de salida al sistema operativo, que luego se devuelve al proceso padre en espera. El proceso principal luego reanuda la ejecución.
Los sistemas operativos modernos también proporcionan llamadas al sistema que permiten que el subproceso de un proceso cree otros subprocesos y espere a que terminen ("se unan ") de manera similar.
Un sistema operativo puede proporcionar variaciones de la llamada de espera que permiten a un proceso esperar a que salga cualquiera de sus procesos secundarios , o esperar a que salga un único proceso secundario específico (identificado por su ID de proceso ).
Algunos sistemas operativos emiten una señal ( SIGCHLD ) al proceso padre cuando termina un proceso hijo, notificando al proceso padre y permitiéndole recuperar el estado de salida del proceso hijo.
El estado de salida devuelto por un proceso hijo normalmente indica si el proceso terminó de manera normal o anormal . Para la terminación normal, este estado también incluye el código de salida (generalmente un valor entero) que el proceso devolvió al sistema. Durante los primeros 20 años de UNIX, solo los 8 bits más bajos del código de salida han estado disponibles para el padre en espera. En 1989 con SVR4 , [ cita requerida ] se introdujo una nueva llamada waitid que devuelve todos los bits de la llamada de salida en una estructura llamada siginfo_t en el miembro de estructura si_status . [ cita requerida ] Waitid es una parte obligatoria del estándar POSIX desde 2001.
Zombis y huérfanos
Cuando un proceso hijo termina, se convierte en un proceso zombie , y continúa existiendo como una entrada en el sistema de tabla de procesos a pesar de que ya no es un programa que se ejecuta de forma activa. En condiciones normales de funcionamiento, su padre lo esperará inmediatamente y luego el sistema lo cosechará, recuperando el recurso (la entrada de la tabla de proceso). Si su padre no atiende a un niño, continúa consumiendo este recurso indefinidamente y, por lo tanto, es una pérdida de recursos . Tales situaciones se manejan típicamente con un proceso especial de "reaper" [ cita requerida ] que ubica a los zombis y recupera su estado de salida, permitiendo que el sistema operativo luego desasigne sus recursos.
Por el contrario, un proceso hijo cuyo proceso padre termina antes de que se convierta en un proceso huérfano . Tales situaciones se manejan típicamente con un proceso especial "raíz" (o "init"), que se asigna como el nuevo padre de un proceso cuando su proceso padre sale. Este proceso especial detecta cuándo termina un proceso huérfano y luego recupera su estado de salida, lo que permite que el sistema desasigne el proceso hijo terminado.
Si un proceso hijo recibe una señal, un padre en espera continuará la ejecución dejando atrás un proceso huérfano. [ cita requerida ] Por lo tanto, a veces es necesario verificar el argumento establecido por wait, waitpid o waitid y, en el caso de que WIFSIGNALED sea verdadero, esperar a que el proceso hijo vuelva a desasignar los recursos. [ cita requerida ]