Sie sind auf Seite 1von 24

INF239 - Sistemas Operativos

Tema: Comunicacin entre procesos relacionados


PARTE A
Resumen: Llamadas al sistema que debe revisar: fork(), wait(), waitpid(), fflush(), getpid(), getppid() Los primeros ejemplos: 1.- Este primer programa crea un proceso hijo y tanto el padre como el hijo muestran por pantalla su identificador de proceso (pid). Recuerde que en el momento que se ejecuta la llamada al sistema fork() son dos procesos en ejecucin simultnea (multiprogramacin) cuya lnea de partida es el valor que devolvi el fork() tanto al padre como al hijo (el padre recibe el pid del hijo y el hijo recibe 0). De esta manera se puede bifurcar la ejecucin para que el padre ejecute una accin diferente al hijo.

En el men principal de Vim elija C/C++/Run/ save and compile para compilar el programa, deber obtener en la parte inferior de la ventana un mensaje semejante al siguiente:

Despus debemos enlazar las funciones de librera al programa, elija C/C++/Run/link. aparecer el siguiente mensaje:

. Para ejecutar el programa elegimos C/C++/Run/run y obtendremos en la parte inferior de la ventana la siguiente salida:

Laboratorio 1

2012-1

INF239 - Sistemas Operativos

Esta secuencia de pasos pueden ser llevado a cabo mediante atajos, pero tenga cuidado que el atajo para salvar y compilar (Alt+F9), en Ubuntu est definido para minimizar la ventana, de forma que tendra que modificar la definicin en Gnome para lograr su efecto en Vim. Sera interesante ver de forma grfica el rbol de procesos. Existe el programa pstree que muestra el rbol de procesos mostrando su dependencia. Observe el programa en ejecucin:

Podemos incluir este comando para que se ejecute en nuestro programa de forma que podamos ver el rbol de procesos. Nuestro programa quedara modificado de la siguiente forma:

Compile, enlace y ejecute el programa. La salida ser semejante a la anterior, pero se habr creado un archivo con nombre ejmp2.4.out conteniendo la salida del comando pstree. Este archivo es creado en nuestro home, de modo que si sus programas estn en otro directorio, tendr que ir al home para encontrarlo.
Laboratorio 1 2012-1

INF239 - Sistemas Operativos

A continuacin mostramos el archivo ejmp2.4.out, en la parte que nos interesa:

El programa ejmp2.4

Sin embargo aqu hay algo que no concuerda, nuestro programa debera crear un proceso hijo que tiene igual nombre pero diferente pid. Es decir deba aparecer algo as como:
ejmp2.4 --- ejmp2.4 --- sh --- pstree

La explicacin es muy sencilla, en el programa se puede observar que el proceso hijo hace ms tareas que el proceso padre, por tanto el padre terminar primero y el hijo quedar hurfano e inmediatamente adoptado por init (el padre de todos los procesos). Tarea 1: a) Modifique el programa para que el padre espere al hijo, de forma que cuando el hijo tome la foto con pstree, el padre salga en ella. La salida del archivo ejmp2.4.out debe ser semejante a la siguiente:
Mostrando al padre e hijo

b) Explique la presencia del proceso sh. c) Lea el manual de pstree y vea si hay alguna forma de slo mostrar la rama correspondiente a un proceso proporcionndole su pid. Modifique el programa para obtener esta salida. d) Modifique el programa para que el archivo ejmp2.4.out sea creado en el directorio donde se encuentra sus programas fuentes y no en el home. Nota: recuerde que al incluir nuevas funciones de librera o llamadas al sistema, tambin debe indicar los correspondientes archivos de cabecera (archivos .h)
Laboratorio 1 2012-1

INF239 - Sistemas Operativos

2.- Escriba los siguientes programas (ejmp2.5.c y ejmp2.6.c)

Compile, enlace y ejecute cada uno de los programas.

Laboratorio 1

2012-1

INF239 - Sistemas Operativos

Tarea 2 a) Modifique el programa ejmp2.5.c para que se genere el archivo ejmp2.5.out que contendr la salida del programa pstree mostrando el rbol de procesos creados por el proceso padre. b) Modifique el programa ejmp2.6.c para que se genere el archivo ejmp2.6.out que contendr la salida del programa pstree mostrando el rbol de procesos creados por el proceso padre. 3.- Para obtener el rbol de procesos mostrados por pstree est claro que todos los procesos que queremos que aparezcan en la salida deben estar vivos. Pero hay situaciones en las que el proceso se crea e inmediatamente muere y al final se desea obtener el rbol de procesos que se cre, obviamente pstree no nos servir de mucho puesto que la mayora de procesos ya murieron. Podra forzarse para que los procesos sigan vivo, pero a veces el cdigo no lo permite Escriba, compile, enlace y ejecute los siguientes programas (multifork.c y isengfork.c ):

Laboratorio 1

2012-1

INF239 - Sistemas Operativos

Tarea 3 a) Haciendo uso de los datos proporcionados por el programa multifork.c elabore un esquema que represente el rbol de procesos generados por el proceso padre. b) En el programa multifork.c cul es la interpretacin de su salida. c) Haciendo uso de los datos proporcionados por el programa isengfork.c elabore un esquema que represente el rbol de procesos generados por el proceso padre. d) En el programa isengfork.c cul es la interpretacin de su salida. Si cree necesario puede agregar instrucciones adicionales para lograr su objetivo. 4.- (Pregunta 1 del primer laboratorio calificado del semestre 2010-1) Escriba un programa que reciba como argumento un nmero natural n (mayor que 0) y cree un rbol binario de procesos de profundidad n. Cuando sea creado el rbol, cada proceso deber imprimir la frase Soy el proceso x y luego terminar. Los nodos del rbol de procesos deberan ser numerados de acuerdo al esquema primero-en-anchura. Por ejemplo, si el usuario ingresa lo siguiente:
$treebreadth4

. . . construir un rbol de profundidad 4.

luego el rbol de procesos debera tener una apariencia semejante a la siguiente:

y la salida debera ser:


Soyelproceso1 Soyelproceso2 Soyelproceso3 Soyelproceso4 Soyelproceso5 Soyelproceso6 Soyelproceso7 Soyelproceso8 Soyelproceso9 Soyelproceso10 Soyelproceso11 Soyelproceso12 Soyelproceso13 Soyelproceso14 Soyelproceso15

Laboratorio 1

2012-1

INF239 - Sistemas Operativos

Solucin

Se han aadido las llamadas al sistema getpid() y getppid(), para verificar que los procesos han sido creados tal como se han solicitado en la pregunta. Tarea 4 a) Modifique el programa para que se obtenga el archivo treebreadth.out que contenga la salida del programa pstree, mostrando el rbol de procesos. b) Escriba un programa que cree un rbol de procesos, semejante al anterior, pero que el recorrido que se realiza para la creacin de procesos sea siguiendo el esquema primero-en-profundidad. Pginas web del laboratorio que puede ayudarle: http://inform.pucp.edu.pe/~inf232/Semestre-2001-2/Laboratorio-2/index.htm http://inform.pucp.edu.pe/~inf232/Semestre-2006-2/Laboratorio-3/index.htm http://inform.pucp.edu.pe/~inf232/Semestre-2009-2/Laboratorio-1/index.htm

Laboratorio 1

2012-1

INF239 - Sistemas Operativos

PARTE B
Resumen: Llamadas al sistema que debe revisar: pipe(), dup(), dup2(), read(), write(), close(). Funciones de librera que debe revisar: execl(), execv(), execle(), execlp(), execvp()

1.- El programa forknpipe.c comunica un padre con su hijo, observe el dibujo.

(6.a) Un proceso despus de invocar pipe()

(6.b) El mismo proceso invoca fork()

(6.c) Cerrando los descriptores innecesarios

Laboratorio 1

2012-1

INF239 - Sistemas Operativos

7.- El programa forknpipe2.c comunica 4 procesos.

Laboratorio 1

2012-1

INF239 - Sistemas Operativos

10

8.- Escriba un programa para formar un anillo de n procesos, de forma que un mensaje es enviado por P0 es transmitido a P1, P1 lo transmite a P2, y as sucesivamente. Al final P0 vuelve a recibir el mensaje.

Solucin En INF239 SISTEMAS OPERATIVOS (Intranet) en la carpeta Material Adicional se ha colocado parte del captulo 7 del libro UNIX SYSTEMS Programaming, donde se explica el programa que ha continuacin se presenta.

Laboratorio 1

2012-1

INF239 - Sistemas Operativos

11

9.- (Pregunta 2 del primer laboratorio calificado del semestre 2010-1) Escriba un programa que cree un anillo de 3 procesos conectados por pipes. El primer proceso deber pedir al usuario que ingrese por teclado una cadena y enviarlo al segundo proceso. El segundo proceso deber invertir la cadena y enviarla al tercer proceso. El tercer proceso deber convertir los caracteres alfabticos a maysculas y enviarlas de regreso al primer proceso. Cuando el primer proceso obtiene la cadena de procesos, deber imprimirla en la terminal. Cuando se esto se lleve a cabo todos los procesos debern terminar. A continuacin una ilustracin del

anillo de procesos.

A continuacin un ejemplo de la ejecucin del programa.


$./ring3 . . . corre el programa Porfavoringreseunacadena:ole Lacadenaprocesadaes:ELO $_

Nota: la cadena debe ser ingresada por teclado y tener como mximo 20 caracteres. Sugerencias: Para invertirla la cadena el segundo proceso debe leer, del primer pipe, toda la cadena en un arreglo, determinar la posicin del ltimo carcter de la cadena con la funcin strlen() y grabar por carcter en orden inverso en el segundo pipe (incluya el carcter cambio de lnea). El tercer proceso lee carcter por carcter y lo convierte en maysculas con la funcin de librera toupper() y graba en el tercer pipe para que lo lea el proceso primero. ste toma carcter por carcter y lo imprime, no haga cambio de lnea en la impresin.

Laboratorio 1

2012-1

INF239 - Sistemas Operativos

12

Solucin:

Laboratorio 1

2012-1

INF239 - Sistemas Operativos

13

10.- (Pregunta 5 del examen parcial del 2008-1) (Sandra Mamrak & Shaun Rowland) El mandato ps | sort |
less para obtener la lista de procesos, ordenarla y paginarla interactivamente con avance o retroceso, requiere la

construccin de dos tuberas (pipes) que puede implementarse por shell de varias formas. En las siguientes figuras se presentan dos formas diferentes. Presente los bosquejos solamente (no los programas completos, tampoco se necesita declarar todas las variables) que usen fork(), exec(), pipe(), dup2(), close() y waitpid() para estas dos implementaciones de arquitecturas de procesos. Preste una atencin especial al cierre de todos los descriptores de tuberas y explique cmo cada proceso sabr el momento de acabar su ejecucin. Para los mandatos de shell que exigen la construccin de 3, 4 o ms tuberas se observar que la segunda forma de implementacin es ms ventajosa. Por qu?

Solucin: Aunque la pregunta solicitaba un bosquejo, a continuacin se ha implementado el programa para el primer caso.

Laboratorio 1

2012-1

INF239 - Sistemas Operativos

14

11.- Elabore un programa que implemente el segundo esquema. Pginas web del laboratorio que puede ayudarle: http://inform.pucp.edu.pe/~inf232/Semestre-1999-2/Laboratorio1/index.htm http://inform.pucp.edu.pe/~inf232/Semestre-2000-1/Laboratorio-2/index.htm http://inform.pucp.edu.pe/~inf232/Semestre-2000-2/Laboratorio-1/index.htm http://inform.pucp.edu.pe/~inf232/Semestre-2001-1/Laboratorio-3/index.htm http://inform.pucp.edu.pe/~inf232/Semestre-2002-1/Laboratorio-3/index.htm http://inform.pucp.edu.pe/~inf232/Semestre-2003-1/Laboratorio-3/index.htm http://inform.pucp.edu.pe/~inf232/Semestre-2005-1/Laboratorio-3/index.html http://inform.pucp.edu.pe/~inf232/Semestre-2007-2/Laboratorio-3/index.htm http://inform.pucp.edu.pe/~inf232/Semestre-2008-1/Laboratorio-3/index.htm Objetivos del laboratorio El laboratorio tiene los siguientes objetivos (estos sern los que marquen las pautas para las preguntas) A.- Verificar que el alumno ha comprendido los programas que se presentaron como ejemplos o soluciones. Como no es posible evaluar todos los programas, se tomar solo uno de ellos. B.- Comprobar que el alumno ha realizado las tareas dejadas en este material, aplicando el mismo procedimiento a problemas semejantes a los solicitados. C.- Evaluar la capacidad de anlisis y respuesta frente a situaciones nuevas que pueden ser solucionadas a partir de los ejemplos presentados en este material. Importante No necesita traer cdigo adicional. Si hubiera necesidad de escribir algn cdigo base, este le ser proporcionado en el laboratorio.

Pando, 04 de Abril de 2012.

Prof: Alejandro T. Bello Ruiz

Laboratorio 1

2012-1

INF239 - Sistemas Operativos

15

Solucin al Laboratorio Nro 1 (2do Perodo del 2011) 1.- (5 puntos) Se tiene el programa arbol.c (usted ha descargado junto con este documento una copia) que despus de ser ejecutado muestra mensajes de los pids de todos los procesos creados incluyendo el identificador del padre.

Salida

En total son 16 procesos. Se pide insertar lneas apropiadas en el programa, sin modificar en esencia el mismo, de manera que al ejecutarse, muestre el rbol completo de procesos. Sugerencias: a) Para no mostrar el rbol de procesos del sistema (desde init) puede emplear la siguiente lnea:
pstree -p pid

donde pid indica el identificador del proceso padre cuyo rbol se quiere mostrar. b) Para obtener una cadena a partir de datos dinmicos, puede emplear la funcin de librera sprintf().
id = getpid(); /* id y cad variables previamente definidas */ sprintf(cad,Mi pid es %d,id); printf(%s\n,cad); /* Imprimir algo como 'Mi pid es 1948' */

Laboratorio 1

2012-1

INF239 - Sistemas Operativos

16

Solucin El objetivo de esta pregunta es evaluar si el alumno es capaz de concluir que no se puede hacer presuncin alguna de los procesos creados. Es decir no se puede asumir que la ejecucin de procesos siguen siempre un orden determinado, esto es un mal supuesto. Debido a esto lo ms seguro era dejar que los hijos se ejecutaran for ever y el padre despus de un tiempo pequeo, un segundo quizs, pueda tomarles la foto, en la que definitivamente salieran todos. A continuacin el cdigo solucin y su salida.

Cdigo agregado

Salida

Recuerde que para considerar el programa correcto, en el rbol deben aparecer los 16 procesos creados. Pueden existir diferentes programas.
Laboratorio 1 2012-1

INF239 - Sistemas Operativos

17

2.- (9 puntos) Para el programa forknpipe2.c, del cul usted ya ha hecho un anlisis previo, se pide hacer un seguimiento del mismo, tal como se indican en el archivo trace.odt (archivo proporcionado con este documento).

Solucin A diferencia de escribir programas en los que este depende de la lgica de cada alumno, en este ejercicio si hay respuesta nica puesto que se hace anlisis de un slo cdigo. El objetivo era hacer un trace al programa mostrado arriba. Se le presento el estado de procesos mediante unos bloques ya preparados para que el alumno contine simplemente copiando los bloques segn la secuencia de ejecucin. A continuacin se muestra lo que se les present como base en el archivo trace.odt

Laboratorio 1

2012-1

INF239 - Sistemas Operativos

18

Solucin parte a)

Laboratorio 1

2012-1

INF239 - Sistemas Operativos

19

Solucin parte b)

Solucin parte c)

Laboratorio 1

2012-1

INF239 - Sistemas Operativos

20

Solucin parte d)

Solucin parte e)

Laboratorio 1

2012-1

INF239 - Sistemas Operativos

21

Solucin parte f)

Las nicas partes difciles son a) y b), el resto de diagramas son sencillas por que slo hay que borra descriptores que estn representados por las flechas. Osea para c), d), e) y f) se hacan copias de la anterior y se proceda a borra los descriptores respectivos. Al final se debe llegar a un anillo de 4 procesos, pero se debe tener un orden con los pipes. 3.- (6 puntos) Se desea escribir un programa con nombre mybackup.c que recibe como argumento por la lnea comandos el nombre de un directorio. El programa debe mostrar al usuario los nombres de los archivos (regulares) que se encuentran en dicho directorio, preguntando si desea hacer una copia o no de cada uno de ellos. Si la respuesta es (Y/y/S/s) el programa debe copiar el archivo con el mismo nombre aadindole .bak, en caso contrario no se lleva a cabo accin alguna. Se plantea la siguiente solucin inconclusa. Mostrar los archivos regulares que se encuentran en el directorio indicado en argv[1]. Esto se logra con el comando ls ejecutado con la funcin de librera system(), y filtrado con grep para obtener slo los archivos regulares. Esta estrategia tiene un inconveniente: la salida se mostrar por pantalla, todo en su conjunto. Lo ideal es que el programa tenga acceso a dicha lista y pueda mostrar al usuario el nombre de cada archivo para que responda si se desea hacer un backup o no de este.

A continuacin se muestra el programa y su ejecucin (el archivo fuente tambin es proporcionado con este documento).

Laboratorio 1

2012-1

INF239 - Sistemas Operativos

22

Con la opcin <S-F9> puede ingresar el argumento de la lnea de comando. Para este ejemplo se ingresa el directorio /home/alejandro/Documentos

Escribir e l dire ctorio qu e se de se a com o argum e n to e n la ln e a de com an dos

Luego ejecute el programa con <C-F9>. Observe que en la salida se muestran solo archivos regulares.

Laboratorio 1

2012-1

INF239 - Sistemas Operativos

23

Se pide modificar el programa con la siguiente estrategia: el proceso padre crea un pipe y luego hace fork().
El proceso hijo redirecciona su salida estndar por el de escritura del pipe. De forma que todo lo que el hijo imprima a la salida estndar, vaya al pipe. A continuacin el hijo invoca la funcin de librera execv() pidiendo que se ejecute un shell con la siguiente cadena como argumento ls -l dir | grep^- y termina. El padre convierte el descriptor de lectura del pipe en un FILE * con la funcin fdopen() (la finalidad es facilitar la lectura de cadenas ya que read() lee flujo de bytes). Luego con fgets() se lee del pipe lo que el hijo escribi. A continuacin muestra al usuario el nombre y si el usuario responde (Y/y/S/s) se se lleva a cabo la copia con system() invocando el comando cp. Este proceso se repite hasta que no haya nada que leer del pipe. Puede consultar el manual en lnea para los formatos de fdopen() y fgets(). Solucin A continuacin el programa y su ejecucin:

Laboratorio 1

2012-1

INF239 - Sistemas Operativos

24

Antes de mostrar la ejecucin algunos comentarios.

La linea ls -l %s | grep ^- | cut -c 55- fue puesta en la pizarra durante el laboratorio, para facilitar la obtencin de los nombres de los archivos regulares en el pipe. Hubiera sido mejor controlar el comando execl() si retornase < 0, en caso por ejemplo que la ruta del directorio no existiera. Esto no est controlado en mi solucin. Hay dos exquisiteces que no hay que tener en cuenta, primero es muy conocido el problema de ingreso de caracteres con la funcin getc(stdin) getchar() por el retorno de carro que se almacena en la entrada estndar. La funcin fflush() solo limpia la salida estndar, por ese motivo empleo la funcin __fpurge(stdin). Otra forma hubiera sido hacer un while(getchar()=='\n'); pero no se vea muy elegante, as que emplee __fpurge(). La segunda tiene que ver con armar el comando para la copia, hay que recordar primero que se debe de encontrar en el directorio donde se encuentra los archivos, por eso primero se debe hacer un cd y luego ejecutar el comando cp. Para este comando se emplea los apstrofos ( '') para poder copiar nombres de archivos conteniendo caracteres especiales y espacios en blanco.

Antes de ejecutar el programa se ha pasado como argumento por la lnea de comandos el directorio /home/alejandro/Documentos

Observe que se han copiado slo los 2 primeros archivos

Primera copia

Segunda copia

Primera copia

Segunda copia

Laboratorio 1

2012-1

Das könnte Ihnen auch gefallen