Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Generacin de Ideas
INDICADORES DE Accin participativa
EVALUACION: Creatividad de las propuestas
Calidad de respuestas
VALORES: Puntualidad, Honestidad y Responsabilidad
PRACTICA # 3.2
GESTIN DE PROCESOS
Fecha: 20 de octubre de 2016
Nombres: Edwin Eber Belduma Morocho
El 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.
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
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.
pupilo@laurel:~/ProgrPrac$ ./Exec_A
Exec_A: Antes del exec PID=25020 PPID=20580
Exec_A: Despus del exec PID=25020 PPID=20580
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 se encuentra el arhivo o directorio.
Respuesta:
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:
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
pupilo@laurel:~/ProgrPrac$
Huerfano: HIJO PID=28491 PPID=1
pupilo@laurel:~$ ps -l -u pupilo
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.
Shell 1:
pupilo@laurel:~/ProgrPrac$
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 <defunct>
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.
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.
Las combinaciones de teclado son programables. Para ver los valores que tienen
se puede utilizar el mandato stty. Dicho comando tambin permite cambiar esos
valores.
pupilo@laurel:~$ stty -a
speed 38400 baud; rows 24; columns 80; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W;
lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff
-iuclc -ixany -imaxbel
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke
Ejecute otra vez el programa y mtelo con ^\ o ^< segn sea su teclado. Ver que
ahora el proceso termina con un Quit.
pupilo@laurel:~/ProgrPrac$ ./Parado
pupilo@laurel:~$ ps -l -u pupilo
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
5 S 27182 20783 20777 0 76 0 - 1810 - ? 00:00:00 sshd
0 S 27182 20784 20783 0 76 0 - 814 wait pts/3 00:00:00 bash
0 S 27182 21556 20783 0 76 0 - 816 wait pts/0 00:00:00 bash
0 S 27182 22503 21556 0 78 0 - 361 pause pts/0 00:00:00 Parado
0 R 27182 22507 20784 0 78 0 - 652 - pts/3 00:00:00 ps
Shell 1: Regrese a Shell1 y observe que aparece el proceso Parado como detenido,
de igual forma que cuando se pulsa ^Z.
pupilo@laurel:~/ProgrPrac$ kill %1
Compruebe que el proceso ha terminado.
pupilo@laurel:~/ProgrPrac$ ps
PID TTY TIME CMD
21556 pts/0 00:00:00 bash
29595 pts/0 00:00:00 ps
[1]+ Terminated ./Signal_C
Temporizador
El SO mantiene uno o varios temporizadores por proceso. Al vencer el
temporizador se produce una seal.
Analice el programa UnSegundo_B cuyo main establece un temporizador de 1 segundo
y ejecuta un bucle infinito. Observe que la funcin que maneja la seal vuelve a
establecer el temporizador. El programa nunca termina por lo que es necesario
matarlo.
pupilo@laurel:~/ProgrPrac$ ./UnSegundo_B
UnSegundo_B: En 1 segundos 373076780 vueltas. Son 373076780 vueltas/segundo.
UnSegundo_B: En 2 segundos 734883602 vueltas. Son 367441801 vueltas/segundo.
UnSegundo_B: En 3 segundos 1108195359 vueltas. Son 369398453 vueltas/segundo.
UnSegundo_B: En 4 segundos 1482007607 vueltas. Son 370501901 vueltas/segundo.
UnSegundo_B: En 5 segundos 1855694339 vueltas. Son 371138867 vueltas/segundo.
pupilo@laurel:~/ProgrPrac$ ./UnSegundo_B0
En 1 segundos 71444536 vueltas. Son 71444536 vueltas/segundo.
En 2 segundos 142839989 vueltas. Son 71419994 vueltas/segundo.
En 3 segundos 214319069 vueltas. Son 71439689 vueltas/segundo.
pupilo@laurel:~/ProgrPrac$ ./UnSegundo_B0
En 1 segundos 71435244 vueltas. Son 71435244 vueltas/segundo.
En 2 segundos 142855180 vueltas. Son 71427590 vueltas/segundo.
Observar que, ahora, el programa se para solo y que el nmero de segundos que
est activo vara de una ejecucin a otra.