En los sistemas operativos de computadoras , un proceso (o tarea ) puede esperar a que otro proceso complete su ejecución. En la mayoría de los sistemas, un proceso padre puede crear un proceso hijo que se ejecuta de forma independiente . El proceso padre puede entonces emitir una llamada al sistema de espera , que suspende la ejecución del proceso padre mientras se ejecuta el hijo. Cuando el proceso hijo finaliza, devuelve un estado de salida al sistema operativo, que luego se devuelve al proceso padre que estaba esperando. El proceso padre luego reanuda la ejecución. [1]
Los sistemas operativos modernos también proporcionan llamadas al sistema que permiten que un hilo de un proceso cree otros hilos y espere a que estos finalicen ("se unan") de manera similar.
Un sistema operativo puede proporcionar variaciones de la llamada de espera que permiten a un proceso esperar a que cualquiera de sus procesos secundarios salga , o esperar a que salga un solo proceso secundario específico (identificado por su ID de proceso ).
Algunos sistemas operativos emiten una señal ( SIGCHLD ) al proceso padre cuando un proceso hijo finaliza, notificándolo y permitiéndole recuperar el estado de salida del proceso hijo.
El estado de salida devuelto por un proceso secundario generalmente indica si el proceso finalizó de manera normal o anormal . Para la finalizació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 estuvieron disponibles para el padre que estaba esperando. 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.
Cuando un proceso hijo termina, se convierte en un proceso zombi y continúa existiendo como una entrada en la tabla de procesos del sistema aunque ya no sea un programa en ejecución activa. En condiciones de funcionamiento normal, normalmente su padre lo esperará inmediatamente y luego el sistema lo cosechará, recuperando el recurso (la entrada de la tabla de procesos). Si su padre no espera a un hijo, continúa consumiendo este recurso indefinidamente y, por lo tanto, se trata de una fuga de recursos . Estas situaciones se manejan normalmente con un proceso "segador" especial [ cita requerida ] que localiza a los zombis y recupera su estado de salida, lo que permite que el sistema operativo luego desasigne sus recursos.
Por el contrario, un proceso hijo cuyo proceso padre finaliza antes que él se convierte en un proceso huérfano . Estas situaciones se suelen gestionar con un proceso "raíz" (o "init") especial, que se asigna como el nuevo proceso padre de un proceso cuando su proceso padre finaliza. Este proceso especial detecta cuándo finaliza un proceso huérfano y luego recupera su estado de salida, lo que permite que el sistema desasigne el proceso hijo finalizado.
Si un proceso secundario recibe una señal, un proceso primario 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 nuevamente a que el proceso secundario desasigne recursos. [ cita requerida ]