Subrutina de espera, waitpid, wait3, wait364y wait4
Finalidad
Espera a que un proceso hijo se detenga o finalice.
Biblioteca
Biblioteca C estándar (libc.a)
Sintaxis
#include <sys/wait.h>
pid_t wait (StatusLocation)
int *StatusLocation;
pid_t wait ((void *) 0)#include <sys/wait.h>
pid_t waitpid (ProcessID,StatusLocation,Options)
int *StatusLocation;
pid_t ProcessID;
int Options;#include <sys/time.h>
#include <sys/resource.h>
#include <sys/wait.h>
pid_t wait3 (StatusLocation, Options,ResourceUsage)
int *StatusLocation;
int Options; struct rusage *ResourceUsage;
pid_t wait364 (StatusLocation, Options,ResourceUsage)
int *StatusLocation;
int Options;
struct rusage64 *ResourceUsage;
pid_t wait4 (ProcessID,(StatusLocation, Options,ResourceUsage)
pid_t ProcessID;
int *StatusLocation;
int Options;
struct rusage64 *ResourceUsage;Descripción
La subrutina espera suspende la hebra de llamada hasta que el proceso recibe una señal que no se bloquea ni se ignora, o hasta que uno de los procesos hijo del proceso de llamada se detiene o finaliza. La subrutina espera vuelve sin esperar si el proceso hijo que se está esperando para detener o termina antes de la llamada. En una salida satisfactoria, la subrutina espera devuelve el Pid del proceso terminado.
La subrutina waitpid incluye un parámetro ProcessID que permite a la hebra de llamada recopilar el estado de un conjunto específico de procesos hijo, de acuerdo con las reglas siguientes:
- Si el valor de ProcessID es igual a un valor de -1, se solicita el estado para cualquier proceso hijo. En este sentido, la subrutina waitpid es equivalente a la subrutina wait .
- Un valor de ProcessID mayor que 0 especifica el ID de proceso de un único proceso hijo para el que se solicita el estado.
- Si el parámetro ProcessID es igual a 0, se solicita el estado para cualquier proceso hijo cuyo ID de grupo de procesos sea igual al del proceso de la hebra de llamada.
- Si el parámetro ProcessID es menor que 0, se solicita el estado para cualquier proceso hijo cuyo ID de grupo de procesos sea igual al valor absoluto del parámetro ProcessID .
Las variantes de subrutina waitpid, wait3, wait364, wait4 proporcionan un parámetro Opciones que puede modificar el comportamiento de la subrutina. Se definen dos valores, WNOHANG y WUNTRACED, que se pueden combinar especificando su OR inclusivo de bits. La opción WNOHANG impide que la hebra de llamada se suspenda aunque haya procesos hijo a esperar. En este caso, se devuelve un valor de 0 que indica que no hay procesos hijo que se detengan o terminen. Si se establece la opción WUNTRACED , la llamada también devuelve información cuando los hijos del proceso actual se detienen porque reciben una señal SIGTTIN, SIGTTOU, SIGSSTPo SIGTASTOP .
Se puede llamar a la subrutina wait364 para que los contadores ruso de 64 bits estén explícitamente disponibles en un entorno de 32 bits.
La subrutina wait4() es similar a la subrutina wait3() excepto que podemos especificar el ID de proceso del hijo. La subrutina wait3() espera cualquier proceso hijo, pero la subrutina wait4() puede esperar un proceso hijo específico.
Las cantidades de 64 bits también están disponibles para aplicaciones de 64 bits a través de la interfaz wait3() y wait4() en los campos ru_utime y ru_stime de struct rusage.
Cuando se está depurando un proceso de 32 bits con ptrace, la ubicación de estado se establece en W_SLWTED si el proceso llama a carga, descargao loadbind. Cuando se está depurando un proceso de 64 bits con ptrace, la ubicación de estado se establece en W_SLWTED si el proceso llama a carga o descarga.
Si la modalidad de depuración multiproceso está habilitada, la ubicación de estado se establece en W_SEWTED si se detiene un proceso durante una subrutina exec y en W_SFWTED si el proceso se detiene durante una subrutina de bifurcación.
Si se suspende más de una hebra en espera de la terminación del mismo proceso hijo, exactamente una hebra devuelve el estado del proceso en el momento de la terminación del proceso hijo.
Si se establece la opción WCONTINUED , la llamada devuelve información cuando los hijos del proceso actual continúan desde una parada de control de trabajos pero cuyo estado no se notifica.
Parámetros
| Elemento | Descripción |
|---|---|
| StatusLocation | Apunta a una variable entera que contiene el estado de terminación del proceso hijo, tal como se define en el archivo sys/wait.h . |
| ProcessID | Especifica el proceso hijo. |
| Opciones | Modifica el comportamiento de la subrutina. |
| ResourceUsage | Especifica la ubicación de una estructura que se debe completar con la información de utilización de recursos para los hijos terminados. |
Macros
El valor al que apunta StatusLocation cuando se devuelven las subrutinas wait, waitpid, wait3o wait4() , se puede utilizar como el parámetro ReturnedValue para las macros siguientes definidas en el archivo <sys/wait.h> para obtener más información sobre el proceso y su proceso hijo.
WIFCONTINUED(ReturnedValue)
pid_t ReturnedValue;Devuelve un valor distinto de cero si el estado devuelto para un proceso hijo que continúa desde una detención de control de trabajo.
WIFSTOPPED(ReturnedValue)
int ReturnedValue;Devuelve un valor distinto de cero si el estado devuelto para un hijo detenido.
int
WSTOPSIG(ReturnedValue)
int ReturnedValue;Devuelve el número de la señal que ha hecho que el niño se detenga.
WIFEXITED(ReturnedValue)
int ReturnedValue;Devuelve un valor distinto de cero si el estado se devuelve para la terminación normal.
int
WEXITSTATUS(ReturnedValue)
int ReturnedValue;Devuelve los 8 bits de orden inferior del estado de salida hijo.
WIFSIGNALED(ReturnedValue)
int ReturnedValue;Devuelve un valor distinto de cero si el estado ha devuelto una terminación anómala.
int
WTERMSIG(ReturnedValue)
int ReturnedValue;Devuelve el número de la señal que ha hecho que el hijo termine.
Valores de retorno
Si la subrutina wait no es satisfactoria, se devuelve un valor de -1 y la variable global errno se establece para indicar el error. Además, las subrutinas waitpid, wait3, wait364y wait4 devuelven un valor de 0 si no hay procesos hijo detenidos o con salida, y se ha especificado la opción WNOHANG . La subrutina de espera devuelve un 0 si no hay procesos hijo detenidos o con salida, también.
Códigos de error
Las subrutinas espera, waitpid, wait3, wait364y wait4 no tienen éxito si se cumple una de las siguientes condiciones:
| Elemento | Descripción |
|---|---|
| ECHILD | El proceso de la hebra de llamada no tiene ningún proceso hijo no esperado existente. |
| EINTR | Esta subrutina se ha terminado mediante la recepción de una señal. |
| EFAULT | El parámetro StatusLocation o ResourceUsage apunta a una ubicación fuera del espacio de direcciones del proceso. |
Las subrutinas waitpid y wait4 no tienen éxito si se cumple lo siguiente:
| Elemento | Descripción |
|---|---|
| ECHILD | El ID de proceso o grupo de procesos especificado por el parámetro ProcessID no existe o no es un proceso hijo del proceso de llamada. |
Las subrutinas waitpid, wait3y wait4 no tienen éxito si se cumple lo siguiente:
| Elemento | Descripción |
|---|---|
| EINVAL | El valor del parámetro Opciones no es válido. |