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).
SVr4, POSIX.1
VÉASE TAMBIÉN¶
signal(2),
getrusage(2),
wait(2),
signal(7)