practica operativos

Upload: eder-aguirre

Post on 03-Nov-2015

232 views

Category:

Documents


3 download

DESCRIPTION

Elaboracion de practica, comunicacion interprocesos (ICS) tuberias

TRANSCRIPT

INSTITUTO POLITECNICO NACIONAL ESCUELA SUPERIOR DE CMPUTO

LABORATORIO DE SISTEMAS OPERATIVOS

PRCTICA 6: Comunicacin inter procesos (IPC) en Linux y Windows

INTEGRANTES: Aguirre Cruz Eder Jonathan Buenda Moreno Hugo Vidal Saules Cortes Jhonatan

MATERIA: Sistemas Operativos

PROFESOR: Cortes Galicia Jorge

GRUPO: 2CM4

FECHA DE ENTREGA: 15 07- 2015

CompetenciaEl alumno comprende el funcionamiento de las tuberas (pipes) sin nombre y de la memoria compartida como mecanismos de comunicacin entre procesos utilizando el intercambio de mensajes tanto en el sistema operativo Linux como Windows.Desarrollo Observaciones Individuales

1.- Aguirre Cruz Eder JonathanSeccin Linux1. A travs de la ayuda en lnea que proporciona Linux, investigue el funcionamiento de la funcin: pipe(),shmget(), shmat(). Explique los argumentos y retorno de la funcin. shmget()

La sintaxis de la llamada de sistema shmget() es la siguiente:shmid = shmget(llave, tamao, bandera);

donde el tamao especifica el nmero de bytes en la regin. El kernel del sistema operativo busca la llave en la tabla de memoria compartida: si no la encuentra y la bandera es IPC_CREAT, se crea una nueva regin y regresa un identificador de tipo entero; si la encuentra, regresa el identificador correspondiente a la regin de memoria.

shmat()Un proceso anexa una regin de memoria compartida a su espacio de direcciones virtuales con la llamada de sistema shmat().virtaddr = shmat(id, addr, banderas);id es el identificador de regin de memoria regresado por una llamada anterior a shmget(), addr es la direccin virtual en donde el usuario desea anexar la regin de memoria compartida, y banderas especifica las caractersticas de la regin de memoria. Al ejecutar shmat(), el kernel verifica que el proceso tenga los permisos necesarios para acceder a la regin. Examina la direccin provista por el usuario: si es 0, el kernel determina una direccin virtual conveniente. La memoria compartida no debe traslaparse con las regiones del espacio de direcciones virtuales. El valor virtaddr regresado por esta llamada es la direccin en la que el kernel anex la memoria compartida, no necesariamente la direccin addr especificada por el usuario. virtaddr es un apuntador genrico (a ningn tipo de dato en especial, implementado en C comnmente como un apuntador de tipo char), es decir:char *virtaddr;Para desasociar la regin de memoria virtual del espacio de direcciones virtuales, se utiliza la llamada shmdt() como sigue:shmdt(virtaddr)

2.- Saules Cortes Jhonatan

#include #include #include #define VALOR 1int main (void){ int desc_arch[2]; char bufer[100]; if(pipe(desc_arch)!=0) exit(1); if(fork()==0) { while(VALOR) { read(desc_arch[0],bufer,sizeof(bufer)); printf(Se recibi: %s\n, bufer); } }while(VALOR){ gets(bufer);write(desc_arch[1],bufer,strlen(bufer)+1);}}

2. Capture, compile y ejecute el siguiente programa. Observe su funcionamiento y explique.

Pantalla de ejecucin

3.- Buendia Moreno Hugo Vidal3. Capture, compile y ejecute los siguientes programas. Observe su funcionamiento y explique. Ejecute de la siguiente forma: C:\>nombre_programa_padre_hijo

#include #include #include int main(int argc, char *argv[]){char mensaje[]=Tuberias en Windows;DWORD escritos;HANDLE hLecturaPipe,hEscrituraPipe;PROCESS_INFORMATION piHijo;STARTUPINFO siHijo;SECURITY_ATTRIBUTES pipeSeg = {sizeof(SECURITY_ATTRIBUTES), NULL, TRUE};/*Obtencin de informacin para la inicializacin del proceso hijo*/GetStartupInfo(&siHijo);/*Creacin de la tubera sin nombre*/CreatePipe(&hLecturaPipe, &hEscrituraPipe, &pipeSeg,0);/*Escritura en la tubera sin nombre*/WriteFile(hEscrituraPipe, mensaje, strlen(mensaje)+1, &escritos, NULL);siHijo.hStdInput = hLecturaPipe;siHijo.hStdError = GetStdHandle (STD_ERROR_HANDLE);siHijo.hStdOutput = GetStdHandle (STD_OUTPUT_HANDLE);siHijo.dwFlags = STARTF_USESTDHANDLES;CreateProcess(NULL,argv[1],NULL,NULL,TRUE, /*Hereda el proceso hijo los manejadores de la tubera del padre*/ 0,NULL,NULL,&siHijo,&piHijo);WaitForSingleObject(piHijo.hProcess,INFINITE);printf(Mensaje recibido en el proceso hijo, termina el proceso padre\n);CloseHandle(hLecturaPipe);CloseHandle(hEscrituraPipe);CloseHandle(piHijo.hThread);CloseHandle(piHijo.hProcess);return 0;}

/*Programa hijo.c*/#include #include int main(){char mensaje[20];DWORD leidos;HANDLE hStdIn = GetStdHandle(STD_INPUT_HANDLE);SECURITY_ATTRIBUTES pipeSeg = {sizeof(SECURITY_ATTRIBUTES), NULL, TRUE};/*Lectura desde la tubera sin nombre*/ReadFile(hStdIn, mensaje, sizeof(mensaje), &leidos, NULL);printf(Mensaje recibido del proceso padre: %s\n, mensaje);CloseHandle(hStdIn);printf(Termina el proceso hijo, continua el proceso padre\n);return 0;}

Pantalla de ejecucin

2.- Saules Cortes Jhonatan

4. Programe una aplicacin que cree un proceso hijo a partir de un proceso padre, el proceso padre enviar al proceso hijo, a travs de una tubera, dos matrices de 15 x 15 a multiplicar por parte del hijo, mientras tanto el proceso hijo crear un hijo de l, al cual enviar dos matrices de 15 x 15 a sumar en el proceso hijo creado, nuevamente el envo de estos valores ser a travs de una tubera. Una vez calculado el resultado de la suma, el proceso hijo del hijo devolver la matriz resultante a su abuelo (va tubera). A su vez, el proceso hijo devolver la matriz resultante de la multiplicacin que realiz a su padre. Finalmente, el proceso padre obtendr la matriz inversa de cada una de las matrices recibidas y el resultado lo guardar en un archivo para cada matriz inversa obtenida. Programe esta aplicacin tanto para Linux como para Windows utilizando las tuberas de cada sistema operativo.

Seccin Linux

/*Padre.c*/

#include#include#include#include#include#include

void SumaMatrices(int a[][15],int b[][15],int r[][15]);void RestaMatrices(int a[][15],int b[][15],int r[][15]);void MultiplicaMatrices(int a[][15],int b[][15],int r[][15]);void TraspuestaMatriz(int a[][15]);int InversaMatriz(int a[][15], float matrizDeInversa[][15]);void ArchPutsMatriz(FILE *Archivo, int Matriz[][15]);void ArchPutsMatrizFloat(FILE *Archivo, float Matriz[][15]);void ArchImprimeMatriz(FILE *Archivo);void ArchImprimeContenido(FILE *Archivo);int main(int argc, char* argv[]){ //Definiendo las matrices a trabajar int Matriz1[15][15],Matriz2[15][15]; int MatrizResultado[15][15]; int i,j; FILE *ArchMatriz1=fopen("mat1.txt","r"); FILE *ArchMatriz2=fopen("mat2.txt","r"); if (ArchMatriz1==NULL || ArchMatriz2==NULL){ printf("Error al cargar los archivos\n"); exit(0); } //Obtener de los archivos las matrices for(i=0; i