Está en la página 1de 10

Avisos

Cambios de grupo
Las personas que no vengan a clase tienen falta, aunque estén conectadas
El prómixo Lunes tendremos el examen tipo test.

1
SESION 3. CONCURRENCIA
PROCESOS (II)

2
PROCESOS - wait(),
pid_t wait(int *status); (incluida en la biblioteca sys/wait.h) espera por el final de uno de sus
hijos, es decir, suspende la ejecución del proceso que la invoca 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. Al contrario que sleep, NO CONSUME
RECURSOS.

Devuelve el PID del hijo que ha terminado


Como parámetro recibe la dirección en donde almacenará el status del proceso hijo al finalizar,

3
PROCESOS – ejercicio 3.1
Implementar un programa que cree un proceso hijo.
- El proceso hijo debe ejecutar un trabajo que le lleve 10 segundos, y después debe salir
indicando al SSOO que todo ha ido ok con exit.
- El proceso padre: debe indicar que ha creado al hijo y para finalizar, debe esperar a su
ejecución

Stdio.h stdlib.h unistd.h sys/wait.h

Utilizar
fork, sleep, wait, exit, getpid, getppid, flush(stdout)

El resultado debe ser algo como:


Padre: 56037 empieza programa
Proceso padre: 56037 proceso hijo creado.
Proceso hijo: 56038 comienza el trabajo.
Proceso hijo: termina el trabajo.
Proceso padre: proceso hijo terminado. 4
PROCESOS – ejercicio 3.2
for (n=0;n<3;n++) {
pid = fork();
if (pid==0) break;
printf(“\nhola”);
}
Printf(“\nadios”);

¿qué hace este Código?


¿cuántos procesos crea?
¿Qué ocurre si quitamos la línea if (pid==0) break;?

Para responder a las preguntas, puedes utilizar printf, imprimiendo el pid


del proceso y el valor de para cada pid.

5
PROCESOS – ejercicio 3.3
int n;
for(n = 0; n < 3; n++){
switch(fork()){
case -1:
perror(“fork()”);
return -1;
case 0:
default:
}
}
return 0;
}
¿cuántos procesos se crean?
¿como es el árbol de procesos?

6
PROCESOS - waitpid(),
pid_t waitpid(pid_t pid, int *status, int options); (incluida en la biblioteca sys/wait.h) espera
por el final del hijo cuyo pid recibe por parámetro. Suspende la ejecución del proceso que la
invoca hasta que el pid hijo ha terminado. NO CONSUME RECURSOS.
Parámetros:
- Pid_t pid: pid del proceso hijo por el que se quiere esperar
- -1: espera por cualquier hijo (lo que hace wait)
- >0: espera por el proceso hijo cuyo id es el que recibie por parámetro.
- Int *status: dirección de memoria en la que guardará el estado de fin del proceso hijo
- Options:
- 0: el proceso espera hasta que finaliza la ejcución del hijo por el que está esperando
(por defecto). Es bloqueante
- WNOHANG: el proceso recupera el estatus de los hijos sin esperar a que finalicen, es
decir, lee el estado y vuelve inmediatamente aunque no haya acabado el hijo. No
BLOQUEA
Devuelve:
- PID del hijo que ha terminado
- 0 si se utilizó WNOHANG y no hay hijo disponible o no se ha podido recuperar su estado
- -1 en caso de error. 7
PROCESOS – ejercicio 3.4
Modifica el ejercicio 3.1 para que utilice waitpid:
a. con la opción -1
b. utilizando el pid del proceso a esperar

Ejemplo de llamada

int status;
pid_t pid;
pid = fork();
if (pid > 0) {
pid = waitpid(pid, &status, 0);
}

8
PROCESOS - WIFEXITED ,
int WIFEXITED(int status); (incluida en biblioteca sys/wait.h) permite saber, a partir del status
devuelto por un proceso, si este finalizó de forma correcta o no.
Parámetro: el status devuelto por el proceso hijo que ha finalizado.
Devuelve:
- 1 en el caso de que la finalización sea correcta
- 0 en caso contrario.
Ejemplo de Código:
int status;
pid_t pid;
pid = fork();
if (pid > 0) {
pid = waitpid(pid, &status, 0);
if (pid > 0) {
if (WIFEXITED(status) == 1) {
printf("El proceso finalizó correctamente\n");
} else {
printf("El proceso no finalizó correctamente\n");
} } } 9
PROCESOS – ejercicio 3.5
Modifica el ejercicio 3.4 para que utilice waitpid pero con el parámetro WNOHANG, es
decir, el padre comprobará si el proceso hijo ha terminado, y si no ha terminado, Vuelve a
esperar 1 Segundo.

Es un Programa con espera no ocupada del padre. El proceso padre tiene que esperar a que su hijo termine el
trabajo antes de finalizar, si no ha terminado, el padre sigue hacienda su trabajo (dormir) durante un segundo.
Cuando finaliza, comprueba el status de su hijo.

Si lo implementamos con WAIT, mientras espera, el padre no puede hacer nada.

Hay que implementarlo con WaitPID y la opción Wnohang, para que el padre pueda comprobar si el proceso
ha acabado, y si no ha acabado, seguir durmiendo.

WAITPID +WNOHANG==> DEVUELVE 0 SI EL HIJO NO HA TERMINADO.

10

También podría gustarte