4. Guion Procesos2.2013

8
PRACTICA # 3.2 GESTIÓN DE PROCESOS Fecha: Martes 05 de Noviembre del 2013 Nombres: Rommel Sáche! El ser" c o e$ec%& El servicio exec() cambia el programa de un proceso. Analice el programa ExecA. !bserve "ue tiene dos sentencias print# una antes del servicio execl $ otra despu%s. Analice el programa &denti#icadores (revise el c'digo) "ue imprime los identi#icadores m s importantes del proceso "ue lo e*ecuta. !bserve "ue utili+a los servicios getpid() getppid() getuid() geteuid() getgid()$ getegid() '(' lo)la(rel:*+Pro,rPrac- more I e/ 0 ca ores.c %Aal ce el c1 ,o& ,tilice la a$uda para averiguar la utilidad de algunas #unciones '(' lo)la(rel:*+Pro,rPrac- ma ,e/' ' 2 4 55 6Para 7(e s r"e ,e/' 8 Res'(es/a: devuelve el identi#icador de proceso actual. (Esto es usado normalmente por rutinas "ue generan nombres -nicos de #ic eros temporales.) '(' lo)la(rel:*+Pro,rPrac- ma ,e/, ' 2 4 52 6Para 7(e s r"e ,e/, 8 Res'(es/a: devuelve el &/ e#ectivo del grupo del proceso actual. E*ecute el programa ExecA comprobando "ue tiene preparado el programa &denti#icadores en el mismo directorio. '(' lo)la(rel:*+Pro,rPrac- .+E$ec A ExecA Antes del exec &/ 2 44 &/ 205 0 &denti#icadores &/ 2 44 &denti#icadores &/ 205 0 &denti#icadores ,&/ 261 2 &denti#icadores E,&/ 261 2 &denti#icadores 7&/ 8000 &denti#icadores E7&/ 8000 !bservamos "ue se a e*ecutado la primera sentencia del programa ExecA pero al tener %xito el execl puesto "ue existe el programa solicitado por el execl $a no se e*ecuta la segunda sentencia print# de ExecA. '(' lo)la(rel:*+Pro,rPrac- ma e$ecl ' 2 4 53 69( hace e$ecl8 Res'(es/a: reem'la!a la ma,e el 'roceso ac/(al co (a (e"a ma,e el 'roceso

description

ninguna

Transcript of 4. Guion Procesos2.2013

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+