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.

Nota: El efecto de la subrutina espera se puede modificar mediante el valor de la señal SIGCHLD . Cuando SIGCHLD está bloqueado y wait () vuelve porque el estado de un proceso hijo está disponible y no hay otros procesos hijo para los que el estado está disponible, entonces cualquier señal SIGCHLD pendiente se borra. Consulte la subrutina sigaction (Subrutina sigaction, sigvec o signal) para obtener detalles.

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.