UNIVERSIDAD NACIONAL DE INGENIER´ IA Facultad de Ingenier´ Ingenier´ıa Industrial Industr ial y de Sistemas Secci´ on de Posgrado y Segunda Especializaci´ on on on
Curso: Sistemas Operativos Avanzados Pr´ actica: actica: Procesos POSIX
Presentada por: Paul Miller TOCTO INGA
Profesor:
PhD. Aldo Camargo Fernandez-Baca
´ LIMA-PERU 15 de Octubre, 2013
Resumen El presente trabajo es desarrollar una pr´ actica correspondiente a los proactica cesos, utilizando los comandos FORK, EXEC, Visibilidad de recursos entre procesos y espera del proceso padre al proceso hijo.
1
´ Indice general 1. Introducci´ on
4
2. Creaci´ on de procesos mediante FORK
5
2.1. Trabajo Pr´ actico . . . . . . . . . . . . . . . . . . . . . . . . . 2.2. Cuestionario . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3. Iniciaci´ on de programas mediante EXEC
5 6 8
3.1. Trabajo Pr´ actico . . . . . . . . . . . . . . . . . . . . . . . . . 3.2. Cuestionario . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4. Visibilidad de recursos entre procesos
8 9 11
4.1. Trabajo Pr´ actico . . . . . . . . . . . . . . . . . . . . . . . . . 11 4.2. Cuestionario . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 5. Ficheros abiertos entre procesos relacionados por una llamada FORK 13
5.1. Trabajo Pr´ actico . . . . . . . . . . . . . . . . . . . . . . . . . 13 5.2. Cuestionario . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 6. Espera del proceso padre al proceso hijo
15
6.1. Trabajo Pr´ actico . . . . . . . . . . . . . . . . . . . . . . . . . 15 6.2. Cuestionario . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 7. Conclusiones
18
8. bibliograf´ıa
19
Ap´ endices
20
.1. .2. .3. .4.
forkprog modificado.c . prog1 modificado.c . . forkprog2 modificado.c espe1 modificado.c . .
. . . .
. . . .
. . . .
2
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
21 22 22 23
Palabras claves FORK, EXEC, Pr´actica, Procesos, Proceso Padre, Proceso hijo.
3
Cap´ıtulo 1 Introducci´ on En la presente trabajo se mostrar´ a un detalle de la pr´actica realiza, mostrando los programas y resultados obtenidos al ejecutar los mismos en un entorno Linux.
4
Cap´ıtulo 2 Creaci´ on de procesos mediante FORK 2.1.
Trabajo Pr´ actico
1. Compile el programa forkprog mediante el comando gcc.
2. Ejecute el programa forkprog en segundo plano (o backgroud). Verifique su ejecuci´ on con la orden ps.
5
2.2.
Cuestionario
a Anote el valor mostrado por el shell inmediatamente despu´es de lanzar el proceso en segundo plano e indique qu´e representa dicho valor. Respuesta.- El Valor mostrado es 2408 y es el PID (Process ID) del proceso del hijo. b ¿Cu´ales son los PID de los procesos padre e hijo? Respuesta.PID del padre=2391 PID del hijo =2392 c ¿Qu´e tama˜ no de memoria ocupan los procesos padre e hijo? Memoria del padre=1041 Memoria del hijo =1041 d ¿Qu´e realiza la funci´on sleep? Respuesta.- Suspende la ejecuci´ on del programa por el tiempo indicado en el par´ametro. ¿Qu´e proceso concluye antes su ejecuci´ on? Respuesta.-El proceso del hijo. e ¿Qu´e ocurre cuando la llamada al sistema FORK devuelve un valor negativo? Respuesta.-El sistema est´ a indicando que no se puede crear el proceso hijo. f ¿Cu´al es la primera instrucci´ on que ejecuta el proceso hijo? Respuesta.-La siguiente instrucci´ on:switch (rf); g Modifique el c´ odigo del programa para asegurar que el proceso padre imprima su mensaje de presentaci´ on (”Soy el proceso...”) antes que el hijo imprima el suyo. Respuesta.-Ver ap´endice forkprog modificado.c
6
7
Cap´ıtulo 3 Iniciaci´ on de programas mediante EXEC 3.1.
Trabajo Pr´ actico
1. Compile los programas prog1.c y prog2.c mediante el mandato gcc.
8
3.2.
Cuestionario
1. Escriba el contenido de los elementos del vector argv que recibe prog1 y los que recibe prog2 Respuesta.Los que recibe prog1: argv=(/.prog1,1,2,3) Los que recibe prog2: argv=(prog2,1,2,3) 2. ¿Qu´e PID tiene el proceso que ejecuta prog1.c? 9
Respuesta.-PID de prog1=2485 ¿Y el de prog2.c? Respuesta.-PID de prog2=2485 3. ¿Qu´e tama˜no de memoria ocupa el proceso,seg´ un ejecute prog1 o prog2? Respuesta.Memoria de prog1 = 1041 Memoria de prog2 = 1499 4. Modifique el programa prog1.c para introducir c´ odigo inalcanzable (p.e. printf(”Hola \n”);)y compruebe que efectivamente no se alcanza. Ver ap´endice prog1 modificado.c ¿La u ´ltima l´ınea de prog1.c (la que dice exit(0);) puede llegar a ejecutarse alguna vez? Respuesta.-No
10
Cap´ıtulo 4 Visibilidad de recursos entre procesos 4.1.
Trabajo Pr´ actico
La compilaci´on y ejecuci´on
4.2.
Cuestionario
1. ¿Las variables enteras i y j del proceso padre son las mismas que las del proceso hijo? 11
Respuesta.- Si son las mismas. 2. ¿Qu´e cambios deber´ıan realizarse en el c´ odigo para que ambos procesos partieran de igual valor de la variable entera i;y adem´ as un proceso realizase su cuenta de uno en uno y el otro proceso de dos en dos? Editar el programa, compilarlo y comprobar su ejecuci´ on. Respuesta.- Ap´endice prog1 modificado.c
12
Cap´ıtulo 5 Ficheros abiertos entre procesos relacionados por una llamada FORK 5.1.
Trabajo Pr´ actico
La compilaci´on y ejecuci´on
13
5.2.
Cuestionario
1. ¿Qu´e significado tiene el empleo de la constante 0666? Respuesta.-La constante 0666 es S IWOTH, que significa que el archivo a crear tiene permisos de escritura. ¿Qu´e permisos tienen los dos ficheros, ficheroA y ficheroB, tras la ejecuci´on del programa? Respuesta.Los mismos permisos ¿Cu´al es la explicaci´on de tal diferencia? Respuesta.No existe diferencia 2. ¿En que afecta el uso del sleep al contenido del archivo? Respuesta.-No afecta.
14
Cap´ıtulo 6 Espera del proceso padre al proceso hijo 6.1.
Trabajo Pr´ actico
La compilaci´on y ejecuci´on
15
6.2.
Cuestionario
1. Modifique el programa espel.c para que el proceso padre imprima el mensaje de finalizaci´ on de su ejecuci´ on 10 segundos m´ as tarde que el proceso hijo Respuesta.- Ver Ap´endice espe1 modificado.c
2. ¿Cu´al es el PPID del proceso hijo, una vez que el padre ha finalizado? ¿Por qu´e? Respuesta.- El PPID del proceso hijo es el mismo PID del padre, porque depende del padre
16
17
Cap´ıtulo 7 Conclusiones En este trabajo se pone en pr´ actica en el entorno Linux: Utilizaci´on de los comandos: FORK, EXEC. Visibilidad de recursos entre procesos. Ficheros abiertos entre procesos relacionados.
18
Cap´ıtulo 8 bibliograf´ıa Sistemas Operativos I Manual de Pr´ acticas Pr´actica 3: Proceso POSIX. Linux Total. 2013 Gu´ıa r´apidad de comandos Linux. Fecha de consulta:14/10/2013. < http : //www.linuxtotal.com.mx/ ?cont = info admon 002 >
19
Ap´ endices
20
.1.
forkprog
modificado.c
#include #include #include int main() { int varfork; varfork=10; int i; printf("Soy el proceso principal, mi PID es %d y mi PPID es %d \n", getpid(),getppid()); sleep (100); pid_t rf; rf = fork(); switch (rf) { case -1: printf("No he podido crear el proceso hijo \n"); break; case 0: for (i = 0; i < 10; i++) { varfork=varfork+1; } printf("Soy el hijo, mi PID es %d y mi PPID es %d\n", getpid(), getppid()); printf("Proceso hijo, varfork es %d \n", varfork); sleep (20); break; default: for (i = 0; i < 10; i++) { varfork=varfork+10; } printf("Soy el padre, mi PID es %d y el PID de mi hijo es %d \n", getpid(),rf); printf("Proceso padre, varfork es %d \n", varfork); sleep (30); } printf("Final de ejecuci´o n de %d \n", getpid()); exit (0); }
21
.2.
prog1
modificado.c
#include #include #include #include int main(int argc, char *argv[]) { int i; printf("\n Ejecutando el programa invocador (prog1). Sus for (i = 0; i < argc; i++) { printf(" argv [%d]: %s \n",i,argv[i]); } sleep (10); strcpy (argv[0],"prog2"); if (execv ("./prog2",argv)<0) { printf("Error en la invocaci´o n a prog2 \n"); exit (1); }; exit(0); printf("Hola \n"); }
.3.
forkprog2
modificado.c
#include #include #include int main() { int i; int j; pid_t rf; rf = fork(); switch (rf) { case -1: printf(" \n No he podido crear el proceso hijo "); break;
22
argumentos son: \n");
case 0: i=0; printf("\n Soy el hijo, mi PID es %d y mi variable i (inicialmente a %d) es par", getpid(), i); for (j = 0; j < 5; j++) { i ++; printf("\n Soy el hijo, mi variable i es %d ", i); }; break; default: i=0; printf("\n Soy el padre, mi PID es %d y mi variable i (inicialmente a %d) es impar", getpid(), i); for (j = 0; j < 5; j++) { i ++; i ++; printf("\n Soy el padre, mi variable i es %d ", i); }; }; printf("Final de ejecuci´o n de %d \n", getpid()); exit (0); }
.4.
espe1
modificado.c
#include #include #include #include int main() { pid_t rf; rf = fork(); switch (rf) { case -1: printf(" \n No he podido crear el proceso hijo "); break; case 0:
23
printf("Soy el hijo, mi PID es %d y mi PPID es %d\n", getpid(), getppid()); sleep (10); break; default: sleep (10); printf("Soy el padre, mi PID es %d y el PID de mi hijo es %d\n", getpid(), rf); wait (0); }; printf(" \n Final de ejecuci´on de %d \n", getpid()); exit (0); }
24