0% encontró este documento útil (0 votos)
14 vistas9 páginas

Uso de wait y waitpid en procesos

Este documento describe las funciones wait y waitpid, las cuales permiten que un proceso padre espere a que terminen los procesos hijos que creó. Estas funciones regresan el PID del proceso hijo que terminó y el estado con el que terminó, el cual puede analizarse usando macros.
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como ODP, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
14 vistas9 páginas

Uso de wait y waitpid en procesos

Este documento describe las funciones wait y waitpid, las cuales permiten que un proceso padre espere a que terminen los procesos hijos que creó. Estas funciones regresan el PID del proceso hijo que terminó y el estado con el que terminó, el cual puede analizarse usando macros.
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como ODP, PDF, TXT o lee en línea desde Scribd

Llamada al sistema:Wait

Después de que un padre crea un proceso hijo,


ambos continúan ejecutándose de forma
concurrente.
Si un padre desea esperar porque el hijo
termine, debe ejecutar wait o waitpid.

pid_t wait(int *status)


pid_t waitpid(pid_t pid, int *status, int opciones)

Prototipo de las funciones de librería.


Wait, WaitPid
La llamada al sistema wait detiene al proceso que la
invoca hasta que un hijo de éste termine
(cualquiera). wait regresa de inmediato si el
proceso que la invoca no tiene hijos o si el hijo ya ha
terminado.
el
Si wait regresa debido a la terminación de un hijo,
valor devuelto es igual al PID del proceso
que finaliza. De lo contrario devuelve –1 y pone un
valor en errno.
Wait, WaitPid
status es un apuntador a una variable entera.
Si el hijo termina sin error, el byte menos significativo es 0 y
el byte más significativo contiene el estado devuelto por el hijo.
Si el byte menos signif. no es cero, los 7 bits menos signif.
contienen la señal que causó su fin abrupto. El octavo bit es 1
si generó un core

pid_t wait(int *status)

La librería POSIX especifica ciertas macros para analizar el estado


devuelto por el hijo (WIFEXITED, WEXITSTUS, WIFSIGNALED,
WTERMSIG, WIFSTOPPED y WSTOPSIG).
Wait, WaitPid
waitpid proporciona un
La función de librería
método para esperar por un hijo en
particular. Tiene tres parámetros. Si pid es igual a –
1, waitpid espera por cualquier proceso. Si pid es
positivo entonces espera al hijo cuyo PID es pid. El
segundo parámetro es la variable donde se devolverá el
status, y el último permite especificar, por ejemplo, si el
padre se bloqueará o no al esperar por los hijos.

pid_t waitpid(pid_t pid, int *status, int opciones)


Ejemplos: Abanico con Wait
nprocesos = 5;
for (i = 0; i < nprocesos; ++i) {
if ((childpid = fork()) < 0) {
perror("fork:");
exit(1);
}
// Codigo que ejecutaran los hijos
if (childpid == 0) {
printf("Soy el hijo con pid %ld\n", getpid());
exit(0);
}
}
// El padre espera que terminen todos los hijos que creo.
for (i = 0; i < nprocesos; ++i)
wait(&status);
printf("El padre termina\n");

}
Abanico que no es concurrente

for (i = 0; i < nprocesos; ++i) {


if ((childpid = fork()) < 0) {
perror("fork:");
exit(1);
}
// Codigo que ejecutaran los hijos
if (childpid == 0) {
printf("Soy el hijo con pid %ld\n", getpid());
exit(0);
}
wait(&status); // evita la concurrencia
}
Cadena con el Wait

nprocesos = 5; i=0
for (i = 0; i < nprocesos; ++i) {
if ((childpid = fork()) < 0) {
perror("fork:");
exit(1); i=1
}
// Codigo que ejecutaran los hijos
i= 2
if (childpid > 0)
break;
}
while ((childpid = wait(&status)) != -1); i=3
printf("Soy el hijo con pid %ld, Mi padre es %ld\n",
getpid(), getppid());
i=4

El primer proceso que sale del wait (le retorna -1),


es el primero en i mprimir el mensaje.
Ejemplo utilizando el valor de status
if ((child_pid = fork()) < 0) {
perror("fork:"); Se debe incluir wait.h
exit(1);
}
// Codigo que ejecutara el hijo
if (child_pid == 0) {
//….
exit(0);
}
// El padre espera el hijo que creo.
while((child_pid = wait(&status)) == -1);
if (!status)
printf("El hijo %ld termino normalmente, el estado devuelto es 0\n", (long)
child_pid);
else if (WIFEXITED(status))
printf("El hijo %ld termino normalmente, el estado devuelto es %d\n", (long)
child_pid, WEXITSTATUS(status));
else if (WIFSIGNALED(status))
printf("El hijo %ld termino debido a una senal no atrapada\n", (long) child_pid);
Utilizando el Valor de Status
R = 0;
/* Creacion de los 2 procesos en abanico */
for (i = 0; i < 2; i++) {
if ((childpid = fork()) < 0) {
perror("fork:"); return(1);
}
/* Codigo que ejecutan los hijos */
if (childpid == 0) return(2);
}

/* El padre espera por todos los hijos y colecta los resultados */


for (i = 0; i < 2; i++) {
wait(&status);
printf("\n\n El proceso %d retorna: %d",i,WEXITSTATUS(status));
if (WIFEXITED(status)) R = R + WEXITSTATUS(status);
}

printf("\n\n Resultado: %d\n\n", R);

También podría gustarte