WAIT4(2)

NOMBRE
wait3, wait4 - esperan la terminación de un proceso, al estilo BSD

SINOPSIS
#include <sys/types.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <sys/wait.h>

pid_t wait3(int *status, int options,
      struct rusage *rusage);

pid_t wait4(pid_t pid, int *status, int options,
      struct rusage *rusage);

DESCRIPCIÓN
La función wait3 suspende la ejecución del proceso actual hasta que finalice un hijo o hasta que se produzca una señal cuya acción sea finalizar el proceso actual o llamar a una función manejadora de señales. Si un hijo ha terminado ya cuando se realiza la llamada (lo que se conoce como proceso "zombie"), la función regresa inmediatamente. Todos los recursos del sistema utilizados por el hijo son liberados.

La función wait4 suspende la ejecución del proceso actual hasta que un hijo, especificado por el argumento pid, haya terminado o hasta que se produzca una señal cuya acción sea finalizar el proceso actual o llamar a una función manejadora de señales. Si el hijo especificado por pid ha terminado cuando se realiza la llamada (lo que se conoce como proceso "zombie"), la función regresa inmediatamente. Todos los recursos del sistema utilizados por el hijo son liberados.

El valor de pid puede ser uno de los siguientes:

< -1
    lo que significa que espera por cualquier proceso hijo cuyo ID de grupo es igual al valor absoluto de pid.

-1  que significa que espera por cualquier proceso hijo; esto es equivalente a llamar a wait3.

0   que significa esperar por cualquier proceso hijo cuyo ID de grupo es igual al del proceso invocador.

> 0 que significa esperar por el proceso hijo cuyo ID es igual a pid.

El valor de options es un OR de cero o más de las siguientes constantes:

WNOHANG
    que significa volver inmediatamente si no hay hijo por el que esperar.

WUNTRACED
    que significa volver porque hay hijos que están parados (estado stop), y de cuyo estado no se ha recibido notificación.

Si status no es NULL, wait3 o wait4 almacenan información de estado en la memoria apuntada por status.

Este estado puede ser evaluado con las siguientes macros (que toman como argumento el propio buffer (un int) — ¡no un puntero al buffer!):

WIFEXITED(status)
    es distinto de cero si el hijo terminó normalmente.

WEXITSTATUS(status)
    evalúa los ocho bits menos significativos del código de retorno del hijo que terminó, que pueden haber sido activados como un argumento en la llamada a la función exit() o como un argumento para un return en el programa principal. Esta macro sólo puede ser evaluada si WIFEXITED devolvió un valor distinto de cero.

WIFSIGNALED(status)
    devuelve "true" si el proceso hijo terminó a causa de una señal no capturada.

WTERMSIG(status)
    devuelve el número de la señal que causó el final del proceso hijo. Esta macro sólo puede ser evaluada si WIFSIGNALED devolvió un valor distinto de cero.

WIFSTOPPED(status)
    devuelve "true" si el proceso hijo que provocó el retorno está actualmente parado; esto sólo es posible si la llamada se hizo usando WUNTRACED.

WSTOPSIG(status)
    devuelve el número de la señal que provocó la parada del proceso hijo. Esta macro sólo puede ser evaluada si WIFSTOPPED devolvió un valor distinto de cero.

Si rusage no es NULL, se rellenará la estructura structrusage, según se define en <sys/resource.h>, con información contable. Ver getrusage(2) para más detalles.

VALOR DEVUELTO
El ID del proceso hijo que terminó, -1 en caso de error (en particular, cuando no existe un proceso hijo, por el que no esperamos, del tipo especificado) o cero si se utilizó WNOHANG y no había ningún hijo disponible todavía. En los dos últimos casos errno será activado convenientemente.

ERRORES

ECHILD
    No existe un proceso hijo como el especificado y por el que no esperamos.

EINTR
    si no se activó WNOHANG y se capturó una señal no bloqueada o una SIGCHLD.

OBSERVACIONES
Incluir <sys/time.h> no es obligatorio en la actualidad, pero incrementa la portabilidad. (De hecho, <sys/resource.h> define la estructura rusage con campos de tipo struct timeval definida en <sys/time.h>.)

El prototipo para estas funciones está disponible sólo si _BSD_SOURCE está definida (bine explícitamente, o implícitamente, no definiendo _POSIX_SOURCE o compilando con la opción -ansi).

CONFORME A
SVr4, POSIX.1

VÉASE TAMBIÉN
signal(2), getrusage(2), wait(2), signal(7)