Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Procesos
Procesos
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.
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
Utilizar
fork, sleep, wait, exit, getpid, getppid, flush(stdout)
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.
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.
10