Está en la página 1de 14

ACTIVIDAD N: 4 FECHA: Jueves 10 de Octubre del 2016

ASIGNATURA: APLICACIN DE SISTEMAS OPERATIVOS

SEMESTRE: Dcimo B 12ava. Promocin.

TEMA: Administracin de Procesos.

UNIDAD N 1: SHELL Y PROCESOS

PROBLEMA: Cmo identificar los procesos hurfanos?

OBJETIVO: Identificar los procesos hurfanos.

Generacin de Ideas
INDICADORES DE Accin participativa
EVALUACION: Creatividad de las propuestas
Calidad de respuestas
VALORES: Puntualidad, Honestidad y Responsabilidad

INTEGRANTE: Belduma Morocho Edwin


TIPO DE ACTIVIDAD
LUGAR ALCANCE FORMA
Intraclase Individual Taller Prctica de laboratorio
Extraclase Grupal
Sntesis, esquemas Prctica de clase
CALIFICACIN Caso de estudio Resolucin de problemas,
Investigativa ejercicios
Vinculacin con la colectividad Ensayo, artculo
Informe de exposicin

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.

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: Se obtiene el identificador del proceso
pupilo@laurel:~/ProgrPrac$ man getgid

p_2006_012 Para que sirve getgid?


Respuesta: Devuelve la identidad o identificador del grupo.

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: Ejecuta un archivo

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 ingresar al archivo identificadores existe un retorno de
0.

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 se encuentra el arhivo o directorio.

p_2006_016 Por qu se muestra ese mensaje?

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:

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: Error de proceso

p_2006_020 Qu sucede si el resultado del fork() es 0?


Respuesta: Pid del proceso hijo.

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 <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.

p_2006_021 Cul es el PID de su proceso zombi?


Respuesta: 7129

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 intr Enva seal SIGINT
* La combinacin [Ctrl+\], llamada quit Enva seal SIGQUIT. Es posible
que en su teclado espaol necesite utilizar la combinacin [Ctrl+<] en vez de
[Ctrl+\].
* La combinacin [Ctrl+z], llamada susp Enva seal SIGTSTP

SIGINT: Interrumpir un proceso


SIGQUIT: Detener un proceso y genera un archivo
SIGTSTP: Seal interactiva para parar un proceso

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

Observe que la nomenclatura utilizada es ^C en vez de [Ctrl+c] y que las teclas


se refieren al teclado ingls, por lo que, en su teclado, la tecla \ puede que
corresponda a la < y la tecla ? a la -.

Analice el programa Parado, programa que nunca termina.

Ejecute el programa Parado y mtelo con ^C.

Ejecute otra vez el programa y mtelo con ^\ o ^< segn sea su teclado. Ver que
ahora el proceso termina con un Quit.

Ejecute nuevamente el programa Parado y pulse ^Z. La accin por defecto de la


seal SIGTSTP es detener el proceso.
Traiga a primer plano el proceso Parado mediante el mandato fg 1 y mtelo.

Abra dos shell.

Shell 1: Ejecute Parado.

pupilo@laurel:~/ProgrPrac$ ./Parado

Shell 2: Vea los procesos

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

Enve la seal SIGTSTP al proceso Parado, en nuestro caso el proceso 22503.


pupilo@laurel:~$ kill - SIGTSTP 22503

Shell 1: Regrese a Shell1 y observe que aparece el proceso Parado como detenido,
de igual forma que cuando se pulsa ^Z.

[1]+ Stopped ./Parado

Shell 2: Observe que el proceso Parado est en estado T.

T Parado por una seal de control de trabajo o porque est siendo


monitorizado.
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 - pts/0 00:00:00 bash
0 T 27182 22503 21556 0 76 0 - 361 finish pts/0 00:00:00 Parado
0 R 27182 22523 20784 0 77 0 - 651 - pts/3 00:00:00 ps

Enve la seal de continuar SIGCONT al proceso Parado.


pupilo@laurel:~$ kill - SIGCONT 22503

S (sleeping) (esperando que se complete un evento). Puede


despertarlo una seal

Compruebe que el proceso pasa a estado S.


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 - pts/0 00:00:00 bash
0 S 27182 22503 21556 0 76 0 - 361 pause pts/0 00:00:00 Parado
0 R 27182 22526 20784 0 78 0 - 651 - pts/3 00:00:00 ps

p_2006_003 Escriba el PID de su proceso Parado.


Respuesta:8392

Shell 1: Traiga a primer plano el proceso Parado. y mtelo.


pupilo@laurel:~/ProgrPrac$ fg 1
./Parado

Analice ahora el programa Signal_C (cdigo).

p_2006_004 Para que sirve strsignal?


Respuesta: Devuelve una cadena que describe una seal.

p_2006_005 Para qu sirve signal?


Respuesta: Manejo de seales en ANSI C
Observe que en el main la seal SIGINT es ignorada, la seal SIGQUIT manejada
con la funcin Handler y que la seal SIGTERM tiene asignada la accin por
defecto. Observe que la funcin Handler recibe como argumento el tipo de seal y
que, adems de imprimir una lnea con la seal recibida, la vuelve a armar.

Ejecute el programa Signal_C.

Pulse ^C, ver que el proceso no muere.

Pulse ^\ o ^>, ver que el proceso escribe una lnea.

p_2006_006 Copie la lnea producida por el proceso.


Respuesta:Recibida la seal

Pulse ^Z, ver que el proceso se para.

[1]+ Stopped ./Signal_C

Mate el proceso parado n 1 mediante el mandato kill %1.

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.

p_2006_007 Explique para que sirve alarm


Respuesta: Activa una alarma para el envi de una seal.

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.

p_2006_008 Ejecute el programa durante un cierto tiempo, mtelo y escriba el


nmero de vueltas que da en 4 segundos.
Respuesta: 2183586046 Vueltas, son 545896511

Edite el programa y, dentro de la funcin Handler modifique la sentencia cnt =


1; poniendo cnt = 0;. Llame al nuevo programa UnSegundo_B0. Ejectelo varias
veces.

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.

p_2006_009 Explique porqu el programa UnSegundo_B0 se detiene solo, mientras


que el programa UnSegundo_B no se detiene nunca.
Respuesta:Debido a que se modific la variable CNT al ponerlee 0 la condicin
cnt>0 no se cumplir por lo que en ciertas vueltas el ciclo terminara.

También podría gustarte