Post on 06-Oct-2015
description
DNI:
PRACTICA # 3.2
GESTIN DE PROCESOS
Fecha: Martes 05 de Noviembre del 2013
Nombres: Rommel SnchezEl servicio exec()
El servicio exec() cambia el programa de un proceso.
Analice el programa Exec_A. Observe que tiene dos sentencias printf una antes del servicio execl y otra despus.
Analice el programa Identificadores (revise el cdigo), que imprime los identificadores ms importantes del proceso que lo ejecuta. Observe que utiliza los servicios getpid(), getppid(), getuid(), geteuid(), getgid()y getegid()
pupilo@laurel:~/ProgrPrac$ more Identificadores.c (Analice el cdigo)
Utilice la ayuda para averiguar la utilidad de algunas funciones
pupilo@laurel:~/ProgrPrac$ man getpid
p_2006_011 Para que sirve getpid?
Respuesta: devuelve el identificador de proceso actual. (Esto es usado normalmente por rutinas que generan nombres nicos de ficheros temporales.)
pupilo@laurel:~/ProgrPrac$ man getgid
p_2006_012 Para que sirve getgid?
Respuesta: devuelve el ID efectivo del grupo del proceso actual.
Ejecute el programa Exec_A comprobando que tiene preparado el programa Identificadores en el mismo directorio.
pupilo@laurel:~/ProgrPrac$ ./Exec_A
Exec_A: Antes del exec PID=24499 PPID=20580
Identificadores: PID=24499
Identificadores: PPID=20580
Identificadores: UID=27182
Identificadores: EUID=27182
Identificadores: GID=6000
Identificadores: EGID=6000
Observamos que se ha ejecutado la primera sentencia del programa Exec_A, pero al
tener xito el execl, puesto que existe el programa solicitado por el execl, ya no se ejecuta la segunda sentencia printf de Exec_A.
pupilo@laurel:~/ProgrPrac$ man execl
p_2006_013 Qu hace execl?
Respuesta: reemplaza la imagen del proceso actual con una nueva imagen del proceso
Observe tambin que los PID y PPID que imprimen los programas Exec_A e Identificadores son idnticos, puesto que se trata del mismo proceso que est ejecutando, primero, el programa Exec_A y luego el programa identificadores.
p_2006_014 Explique porque ya no se ejecuta el segundo printf del programa Exec_A. Analice el cdigo del programa
Respuesta: porque al comando execl cambi la imagen del proceso Exec_A que estaba ejecutandose en memoria por la imagen del proceso Identificadores
Elimine o renombre el ejecutable Identificadores y vuelva a ejecutar Exec_A.
pupilo@laurel:~/ProgrPrac$ ./Exec_A
Exec_A: Antes del exec PID=25020 PPID=20580
Exec_A: Despus del exec PID=25020 PPID=20580
En este caso, al no existir el programa referenciado en el servicio execl, ste devuelve un error y se sigue con la ejecucin del programa Exec_A, por lo que se ejecuta la segunda sentencia printf de dicho programa.
Dado que los servicios del sistema operativo pueden fallar, devolviendo error, es conveniente tratar siempre el caso de error. Esto es especialmente importante para el servicio exec. El programa Exec_C incluye dicho tratamiento. Ejecute dicho programa.
pupilo@laurel:~/ProgrPrac$ ./Exec_C
Exec_C: Antes PID=26514 PPID=20580
Exec_C: execl(): No such file or directory
p_2006_015 Cul es el mensaje de error que observa?
Respuesta: No such file or directory
p_2006_016 Por qu se muestra ese mensaje?
Respuesta: Porque en el cdigo del programa se hace uso del comando perror para tratar el error en caso de no encontrar el arhivo.
Procesos hurfano
Si un proceso muere antes que un hijo, ste queda hurfano y es adoptado por el proceso INIT.
Para este ejercicio se necesitan dos shell y el programa Hurfano. Analice dicho programa (cdigo). Ver que el hijo se queda esperando un carcter del teclado y que el padre temporiza 20 segundos y termina.
Shell 1:
p_2006_018 Copie la lnea de cdigo que pertenece a el padre
Respuesta:
Shell 1: Ejecute el programa Hurfano
pupilo@laurel:~/ProgrPrac$ gcc Wall lpthread Huerfano.c o Huerfano
pupilo@laurel:~/ProgrPrac$ ./Huerfano
Huerfano: PADRE PID=28490 PPID=20580
Shell 2: Ejecute inmediatamente el mandato ps, para ver sus procesos (en lugar de pupilo ponga su nombre de usuario).
pupilo@laurel:~$ ps -l -u pupilo
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
5 S 27182 20579 20564 0 75 0 - 1843 - ? 00:00:00 sshd
0 S 27182 20580 20579 0 75 0 - 813 wait pts/0 00:00:00 bash
0 S 27182 28449 20579 0 75 0 - 813 wait pts/4 00:00:00 bash
0 S 27182 28490 20580 0 76 0 - 360 - pts/0 00:00:00 Huerfano
1 S 27182 28491 28490 0 76 0 - 360 - pts/0 00:00:00 Huerfano
0 R 27182 28492 28449 0 76 0 - 649 - pts/4 00:00:00 ps
Ver que tiene dos procesos Huerfano, el padre y el hijo. Repita el comando ps hasta que el padre termine (pasados los 20 segundos de espera). Observar que el proceso hijo ahora tiene como padre al proceso nmero 1, es decir, al proceso init (puede ver el proceso init con el mandato ps e).
pupilo@laurel:~$ ps -l -u pupilo
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
5 S 27182 20579 20564 0 76 0 - 1843 - ? 00:00:00 sshd
0 S 27182 20580 20579 0 76 0 - 813 - pts/0 00:00:00 bash
0 S 27182 28449 20579 0 76 0 - 813 wait pts/4 00:00:00 bash
1 S 27182 28491 1 0 76 0 - 360 - pts/0 00:00:00 Huerfano
0 R 27182 28500 28449 0 78 0 - 649 - pts/4 00:00:00 ps
Shell 1: Observe que, al terminar el proceso Hurfano padre, se activa el shell por lo que se muestra el prompt. Pulse una tecla. Observar que el proceso Hurfano hijo escribe su mensaje y termina.
pupilo@laurel:~/ProgrPrac$
Huerfano: HIJO PID=28491 PPID=1
Shell 2: Repita el comando para observar que el proceso Hurfano hijo ha terminado.
pupilo@laurel:~$ ps -l -u pupilo
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
5 S 27182 20579 20564 0 75 0 - 1843 - ? 00:00:00 sshd
0 S 27182 20580 20579 0 76 0 - 813 - pts/0 00:00:00 bash
0 S 27182 28449 20579 0 75 0 - 813 wait pts/4 00:00:00 bash
0 R 27182 28537 28449 0 76 0 - 649 - pts/4 00:00:00 ps
Proceso zombi
Un proceso zombie o defunct (muerto) es un proceso que ha completado su ejecucin pero an tiene una entrada en la tabla de procesos, permitiendo al proceso que le ha creado leer el estado de su salida. Metafricamente, el proceso hijo ha muerto pero su "alma" an no ha sido recogida.
La funcin wait suspende la ejecucin del proceso actual hasta que un proceso hijo ha terminado. Cuando un proceso termina sin que su padre est ejecutando un servicio wait, el proceso queda en estado zombi.
Analice el programa Muerto (revise cdigo) y ejectelo en un shell
Shell 1:
pupilo@laurel:~/ProgrPrac$
p_2006_019 Qu sucede si el resultado del fork() es -1?
Respuesta: Se imprimir el nombre del programa y un mensaje de error
p_2006_020 Qu sucede si el resultado del fork() es 0?
Respuesta: Se imprimir el pid del proceso y el pid de su padre
Shell 1: Ejecute el programa Muerto.
pupilo@laurel:~/ProgrPrac$ ./Muerto
Muerto: HIJO PID=28567 PPID=28566
Muerto: PADRE PID=28566 PPID=20580
Shell 2:
pupilo@laurel:~$ ps -l -u pupilo
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
5 S 27182 20579 20564 0 76 0 - 1843 - ? 00:00:00 sshd
0 S 27182 20580 20579 0 76 0 - 813 wait pts/0 00:00:00 bash
0 S 27182 28449 20579 0 76 0 - 813 wait pts/4 00:00:00 bash
0 S 27182 28566 20580 0 77 0 - 360 pause pts/0 00:00:00 Muerto
1 Z 27182 28567 28566 0 77 0 - 0 exit pts/0 00:00:00 Muer
0 R 27182 28568 28449 0 77 0 - 650 - pts/4 00:00:00 ps
Observe que el proceso hijo (PID = 28567) est en estado Z, es decir, en estado zombi.
p_2006_021 Cul es el PID de su proceso zombi?
Respuesta: 3013
Shell 1: Mate al proceso padre mediante [Ctr+c].
Shell 2: Repita el comando ps.
pupilo@laurel:~$ ps -l -u pupilo
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
5 S 27182 20579 20564 0 76 0 - 1843 - ? 00:00:00 sshd
0 S 27182 20580 20579 0 76 0 - 813 - pts/0 00:00:00 bash
0 S 27182 28449 20579 0 75 0 - 813 wait pts/4 00:00:00 bash
0 R 27182 28570 28449 0 76 0 - 650 - pts/4 00:00:00 ps
Al morir el padre, el proceso hijo qued hurfano, adems de zombi, por lo que init pasa a ser su padre. El proceso init est ejecutando un bucle infinito de wait, por lo que el proceso hijo termina.
SEALES
General
Este tipo de llamadas son producidas por el kernel o por otro proceso de forma inesperada y tiene como finalidad detener o desviar el curso normal de las instrucciones que se ejecutan. Una seal puede ser recibida por un proceso si este incurre en un error, en coma flotante, si se produce un error de acceso a memoria, si se intenta acceder a una direccin de memoria fuera de su segmento de datos, etc
Las seales son interrupciones al proceso. Deben tratarse mediante una funcin.
El teclado permite enviar al proceso activo en primer plano las siguientes seales:
*La combinacin [Ctrl+c], llamada intrEnva seal SIGINT
*La combinacin [Ctrl+\], llamada quit Enva seal SIGQUIT. Es posible
que en su teclado espaol necesite utilizar la combinacin [Ctrl+