stringtranslate.com

esperar (llamada al sistema)

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 el hijo se ejecuta. Cuando el proceso hijo finaliza, devuelve un estado de salida al sistema operativo, que luego se devuelve al proceso padre en espera. Luego, el proceso principal reanuda la ejecución. [1]

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 ("unirse") 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 principal cuando finaliza un proceso secundario, notificando al proceso principal y permitiéndole recuperar el estado de salida del proceso secundario.

El estado de salida devuelto por un proceso hijo normalmente indica si el proceso finalizó de forma normal o anormal . Para una 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, sólo los 8 bits inferiores del código de salida estuvieron 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 necesaria ] Waitid es una parte obligatoria del estándar POSIX desde 2001.

Zombis y huérfanos

Cuando un proceso hijo finaliza, se convierte en un proceso zombie 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 esperará inmediatamente y luego el sistema lo cosechará, reclamando el recurso (la entrada de la tabla de procesos). Si un padre no atiende a un niño, continúa consumiendo este recurso indefinidamente y, por lo tanto, se trata de una fuga de recursos . Estas situaciones generalmente se manejan con un proceso especial "segador" [ cita necesaria ] que localiza 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 termina antes que él se convierte en un proceso huérfano . Estas situaciones normalmente se manejan con un proceso "raíz" (o "init") especial, que se asigna como nuevo padre de un proceso cuando su proceso padre sale. Este proceso especial detecta cuándo finaliza un proceso huérfano y luego recupera su estado de salida, lo que permite al sistema desasignar el proceso secundario 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 necesaria ] 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 secundario vuelva a desasignar recursos. [ cita necesaria ]

Ver también

Referencias

  1. ^ "Esperar llamada al sistema en C". Geeks para Geeks . 2017-06-03 . Consultado el 15 de mayo de 2023 .