Provided by: manpages-es_1.55-10_all bug

NOMBRE

       wait, waitpid - espera por el final de un proceso

SINOPSIS

       #include <sys/types.h>
       #include <sys/wait.h>

       pid_t wait(int *status);
       pid_t waitpid(pid_t pid, int *status, int options);

DESCRIPCIÓN

       La  función  wait  suspende  la  ejecución del proceso actual haste que un proceso hijo ha
       terminado, o hasta que se produce una señal cuya acción es terminar el  proceso  actual  o
       llamar  a  la  función  manejadora  de la señal. Si un hijo ha salido cuando se produce la
       llamada (lo que se entiende por proceso "zombie"), la función vuelve inmediatamente. Todos
       los recursos del sistema reservados por el hijo son liberados.

       La  función  waitpid  suspende  la  ejecución  del  proceso  en  curso  hasta  que un hijo
       especificado por el argumento pid ha terminado, o hasta que  se  produce  una  señal  cuya
       acción es finalizar el proceso actual o llamar a la función manejadora de la señal.

       Si  el  hijo  especificado  por  pid ha terminado cuando se produce la llamada (un proceso
       "zombie"), la función vuelve inmediatamente. Todos los recursos del sistema reservados por
       el hijo son liberados.

       El valor de pid puede ser uno de los siguientes:

       < -1   lo  que significa esperar a que cualquier proceso hijo cuyo ID del proceso es igual
              al valor absoluto de pid.

       -1     lo que  significa  que  espera  por  cualquier  proceso  hijo;  este  es  el  mismo
              comportamiento que tiene wait.

       0      lo  que  significa  que  espera  por cualquier proceso hijo cuyo ID es igual al del
              proceso llamante.

       > 0    lo que significa que espera por el proceso hijo cuyo ID es igual al valor de pid.

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

       WNOHANG
              que significa que vuelve inmediatamente si ningún hijo ha terminado.

       WUNTRACED
              que significa que también vuelve si hay hijos parados (pero no  rastreados),  y  de
              cuyo  estado  no ha recibido notificación.  El estado para los hijos rastreados que
              están parados también se proporciona sin esta opción.

       (Para opciones exclusivas de Linux, vea más abajo.)

       Si status no es NULL, wait o waitpid almacena la  información  de  estado  en  la  memoria
       apuntada por status.

       Si  el  estado puede ser evaluado con las siguientes macros (dichas macros toman el buffer
       stat (un int) como argumento — ¡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  podrían  estar activados como el argumento de una llamada a exit() o
              como el argumento de unñ return en el  programa  principal.  Esta  macro  solamente
              puede ser tenida en cuenta si WIFEXITED devuelve 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 provocó la muerte 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  pardo;
              esto  solamente  es posible si la llamada se hizo usando WUNTRACED o cuando el hijo
              está siendo rastreado (vea ptrace(2)).

       WSTOPSIG(status)
              devuelve el número de la señal que provocó la parada del hijo. Esta macro solamente
              puede  ser  evaluada  si  WIFSTOPPED  devolvió  un valor distinto de cero.  Algunas
              versiones de Unix (p.e. Linux, Solaris, pero no AIX ni SunOS) definen  también  una
              macro  WCOREDUMP(status)  para  comprobar  si el proceso hijo provocó un volcado de
              memoria.  Utilícela solamente encerrada entre #ifdef WCOREDUMP ... #endif.

VALOR DEVUELTO

       El ID del proceso del hijo que terminó, o cero  si  se  utilizó  WNOHANG  y  no  hay  hijo
       disponible, o -1 en caso de error (en este caso, errno se pone a un valor apropiado).

ERRORES

       ECHILD si  el  proceso  especificado  en pid no termina o no es hijo del proceso llamante.
              (Esto puede ocurrir para nuestros propios hijos si se asigna SIG_IGN como acción de
              SIGCHLD. Vea también la sección NOTAS DE LINUX sobre hilos.)

       EINVAL si el argumento options no fue valido.

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

OBSERVACIONES

       The  Single Unix Specification (Especificación para un Unix Único) describe un modificador
       SA_NOCLDWAIT (no soportado en Linux) tal que si este modificador está activo, o bien se ha
       asignado  SIG_IGN  como  acción  para  SIGCHLD,  entonces  los  hijos  que  terminan no se
       convierten en zombies y una llamada a wait() o waitpid() se bloqueará hasta que todos  los
       hijos hayan terminado y, a continuación, fallará asignando a errno el valor ECHILD.

       El  estándar POSIX original estableció como indefinido el comportamiento de tratar SIGCHLD
       con SIG_IGN.  Estándares posteriores, incluyendo SUSv2  y  POSIX  1003.1-2001  especifican
       este comportamiento describiéndolo tan solo como una opción conforme con XSI.  Linux no es
       conforme con el segundo de los dos puntos recién descritos:  si  se  hace  una  llamada  a
       wait()  o  waitpid() mientras SIGCHLD está siendo ignorada, la llamada se comporta como si
       SIGCHLD no estuviera siendo ignorada, es decir, se bloquea hasta  que  el  siguiente  hijo
       termina y luego devuelve el PID y el estado de ese hijo.

NOTAS DE LINUX

       En el núcleo de Linux, un hijo planificado por el núcleo no es una construcción distinta a
       un proceso. En su lugar, un hilo es simplemente un proceso que es creado usando la llamada
       al   sistema   única   en  Linux  clone(2)  ;  otras  rutinas  como  la  llamada  portable
       pthread_create(3) son implementadas usando clone(2).  Antes de la versión 2.4.  de  Linux,
       un  hilo era un caso especial de un proceso, y como consecuencia, un hilo no podía esperar
       al hijo de otro hilo, incluso cuando este último pertenecía al mismo grupo de hilos.   Sin
       embargo,  POSIX  recomienda  tal  funcionalidad,  y desde la versión 2.4. de Linux un hilo
       puede, y por defecto lo hará, esperar a hijos de otros hilos en el mismo grupo de hilos.

       Las siguientes opciones específicas de Linux codificadas en options se pueden utilizar con
       hijos creados usando clone(2).

       __WCLONE
              Espera  por  hijos "clone" solamente. Si se omite espera sólo por hijos "no clone".
              (Un hijo "clone" es el que al terminar no  comunica  ninguna  señal,  o  una  señal
              distinta  de SIGCHLD a su padre.)  Esta opción es ignorada si se especifica también
              __WALL.

       __WALL (Desde Linux 2.4) Espera por todos los hijos, sin importar su tipo ("clone"  o  "no
              clone").

       __WNOTHREAD
              (Desde  Linux  2.4)  No espera por hijos de otros hilos en el mismo grupo de hilos.
              Era la opción por defecto antes de la versión 2.4. de Linux.

CONFORME A

       SVr4, POSIX.1

VÉASE TAMBIÉN

       clone(2), ptrace(2), signal(2), wait4(2), pthread_create(3), signal(7)