viernes, 5 de marzo de 2010

WAITPID

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


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


Suspende la ejecución actual del proceso en curso hasta que un proceso hijo, especificado en el

argumento pid ha terminado, o hasta que se produce una señal cuya acción es terminar con el
proceso actual.


El valor de pid puede ser uno de los siguientes:
< -1 Espera a que cualquier proceso hijo cuyo ID del proceso es igual al valor absoluto de pid.
-1 Espera por cualquier proceso hijo; este es el mismo comportamiento que tiene wait.
0 Espera por cualquier proceso hijo cuyo ID es igual al del proceso padre.
> 0 Espera por el proceso hijo cuyo ID es igual al valor de pid (por un proceso determinado).


Opciones:
  • WNOHANG: Vuelve inmediatamente si ningún hijo ha terminado.
  • WUNTRACED: El padre obtiene información adicional si el hijo recibe alguna de las señales
SIGINT, SIGTTOU, SIGSSTP, SIGTSTOP.


Status:

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

  • WIFEXITED(status): Es distinto de cero si el hijo terminó normalmente.
  • WEXITSTATUS(status): Permite obtener el valor devuelto por el proceso hijo en la llamada exit o el valor devuelto en la función main, utilizando la sentencia return. 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 parado; esto solamente es posible si la llamada se hizo usando WUNTRACED o cuando el hijo está siendo rastreado.
  • 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.

Lo que devuelve waitpid es el ID del proceso hijo que termina o 0 en caso de no terminar ningún
proceso, -1 en caso de error.


Ejemplo:
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
pid_t pid1, pid2;
int status1, status2;

if ((pid1=fork()) == 0 ) /* hijo */
printf("Soy el primer hijo (%d, hijo de %d)\n", getpid(), getppid());
else
{ /* padre */
if((pid2=fork()) == 0 )
{ /* segundo hijo */
printf("Soy el segundo hijo (%d, hijo de %d)\n", getpid(), getppid());
}
else
{ /* padre */
/* Esperamos al primer hijo */
waitpid(pid1, &status1, 0);
/* Esperamos al segundo hijo */
waitpid(pid2, &status2, 0);
printf("Soy el padre (%d, hijo de %d)\n", getpid(), getppid());
}
}

return 0;
}

No hay comentarios:

Publicar un comentario