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)