Como comunicar 2 procesos emparentados

Slides:



Advertisements
Presentaciones similares
Arreglos Unidimensionales y Bidimensionales ESTRUCTURAS DE DATOS I
Advertisements

Tema #10. FICHEROS.
Archivos de Texto. Introducción Los archivos son una secuencia de bits que se guarda en el disco duro. La ventaja de utilizar archivos es que los datos.
FICHEROS.
Estructuras de Decisión I IF - THEN - ELSE
Pipes ARISO 2 Rubén Barrio Guerrero
TUTORIAL YOUTUBE ANA ROMANO 07/04/2014. La página de acceso a youtube en español es una vez en ella tendremos que registrarnos.
Listas enlazadas c++ Prof. Franklin Cedeño.
Algoritmos de Remplazamiento de Paginas
Estructuras de control
Programación, Algoritmos y Estructuras de Datos
Cliente.pl #!/usr/local/bin/perl use Socket; ($them, $port) $port = 2345 unless $port; $them = 'localhost' unless $them; El primer argumento es.
SISTEMAS OPERATIVOS UNIDAD 1..
Ejemplo: Creación y mutación de procesos
GESTOR DE BASES DE DATOS RELACIONALES
Las variables en PHP Programación en Internet II.
CI TEORIA semana 8 Subprogramas o funciones Definición de funciones.
Multiprogramación Procesos Cecilia Hernández
COLAS, IMPLEMENTACIÓN A PARTIR DE LISTAS Y PARA PILAS
Supongamos que nos plantean el siguiente problema:
TRADUCTOR DE UN PROGRAMA
Igor Santos Grueiro. Ahora tenemos datos y datos …
Archivos Programación.
Informática Ingeniería en Electrónica y Automática Industrial
Archivos. fopen(...) Para comenzar a utilizar un archivo primero se debe abrir, invocando a la función fopen(...) FILE * fopen(char* nombre_arch, char*
Semana 5 Subprogramas..
Administración de Archivos
UNIDAD 2:Crear, abrir y cerrar una base de datos Hacer clic sobre la opción Nuevo de la pestaña Archivo. Se mostrarán las distintas opciones para nuevos.
Unidad III Administración de procesos
Archivos.
Tema 10a Manejo de archivos. Introducción Un computador puede almacenar grandes cantidades de información. Puede acceder a ella de manera muy rápida.
Clase 10: Estructuras de datos y arreglos.
Comentarios en PHP Programación en Internet II. Comentarios en PHP Programación en Internet II Universidad de Guadalajara | Centro Universitario de la.
Valor X Valor Y Punto (0,0) Coordenadas.
Crear un server LAN con Hamachi V Ahora tendremos tanto el programa minecraft como el Hamachi instalados, y el minecraft server (.exe o.jar) en nuestra.
Soporte HW para Administración de Memoria Cecilia Hernández
Estructura del sistema de Archivos de
Aplicación de estructuras de datos
Particionado de discos duros
Nuevas Tecnologías Aplicadas a la Educación 3º Educación Social. Curso académico 2009/2010 Práctica 4. Crea tu propio blog Con Blogger Mª Trinidad Rodríguez.
Entrada y salida Gestión de ficheros.
1 Unidad IV Archivos en Java y C++ M.C. Juan Carlos Olivares Rojas.
Problema de inclusión en una Curva Digital Por Orellana Muñoz, Alfonso Paz Vicente, Rafael Pérez Medina, Gerardo Rodríguez Naranjo.
CONCEPTOS FUNDAMENTALES DEL NIVEL DEL SISTEMA OPERATIVO
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) cec.uchile.cl Módulo ECI - 11: Fundamentos de Redes de Computadores.
Redireccionamiento Realizado por Kepa Bengoetxea.
1 Asignación Dinámica de Memoria Agustín J. González ELO 329.
INSTRUCCIONES. El alumno, seguirá los pasos que se le va indicando a continuación. En el recuadro en blanco, debe ir añadiendo un pantallazo con la.
Vamos a tratar algunos temas que es necesario conocer a la hora de administrar un sistema informático y que nos van a ser útiles sin importar el sistema.
PHP con Bases de Datos Tema 5 Funciones Introducción Valor de una Función Función para obtener fecha actual. Documentación de Funciones Funciones de Usuario.
UNIDAD V Bibliotecas de Funciones L.I. & M.S.C. OSCAR RAMÍREZ CORTÉS PROGRAMACIÓN DE SISTEMAS.
CONBINACION DE CORRESPONDENCIA
Computación I. CI-2125 Tema VIII
Introducción al lenguaje PROCESSING para ARDUINO
P.G.F Ventana de trabajo del S7 Manager P.G.F
Repaso de archivos #include int main(void) { FILE *fp; fp=fopen(“prueba.txt”, “w”); if (fp==NULL) { printf(“Error al abrir el archivo\n”); printf(“No lo.
Metodología de Programación Ayudantía 4 lelagos.ublog.cl 2009.
Desarrollador Profesional de Juegos Programación III Unidad II Trabajando con bloqueo de datos.
Clase 1 Gabriela Araya Baez.. Char: Variable que almacena caracteres. Int: Variable que almacena enteros. Float: Variable que almacena decimales. Doble:
Desarrollador Profesional de Juegos Programación III Unidad II Introdución a threading en windows.
Desarrollador Profesional de Juegos Programación III Unidad II introducción a Mutex Secciones críticas.
¿Cómo programar un Botón para agregar registros a una base de datos?
Curso: Fundamentos de Computación
Archivos. Introducción Los datos que hemos tratado hasta el momento han residido en la memoria principal. Sin embargo, las grandes cantidades de datos.
Comandos básicos Linux I. Comandos BásicosI $ date $ cal$ cal $cal Encadenado de comando: $ date;pwd;cal Visualizar texto por pantalla:
Manejo de archivos de texto.  Unidad fundamental de almacenamiento dentro del ámbito de la informática. Alberga un conjunto de datos que es posible leer,
Métodos en Java. Estructura de un programa en Java ► La relación con la vida misma la podemos ver en el siguiente comentario: Imaginemos que dos clases.
El proceso ensamblador. José Luis Vergara Soberanis.
P ROCESO DE E NSAMBLADO Cámara Vázquez Berenice Rubí.
UNIVERSIDAD AUTÓNOMA DEL ESTADO DE MÉXICO FACULTAD DE INGENIERÍA COORDINACIÓN DE MATERIAS PROPEDÉUTICAS INGENIERÍA EN SISTEMAS ENERGÉTICOS SUSTENTABLES.
Transcripción de la presentación:

Como comunicar 2 procesos emparentados Mediante una pipe sin nombre

Que queremos hacer… Lo mismo que haría la Shell al hacer…. ps –A |grep [COMANDO] Donde [COMANDO] será un texto que buscaremos en la salida del comando ps.

¿Que hace la Shell al hacer esto? fork fork ps -A grep El proceso que ejecutará ps escribe sus datos en la salida std (canal 1)  Hay que redireccionar la salida std del proceso que hará el ps El proceso que ejecutará el grep, lee sus datos de la entrada std (canal 0)  Hay que redireccionar la entrada std del proceso que hará el grep

Que necesitamos 2 procesos (emparentados, sino no se pueden usar pipes sin nombre) 1 pipe sin nombre Como es solo para estos procesos, no tiene sentido crear una pipe con nombre, pero también se podría usar La pipe la usarán el proceso ps y el grep hay que crearla antes que cualquiera de los dos procesos para que la hereden

PASO 1: Esquema de procesos (simplificado) void main(int argc,char *argv[]) { int pid_ps,pid_grep; if (argc!=2) usage(); pid_ps=fork(); if (pid_ps==0){ // El hijo mutará a ps execlp("ps","ps","-A",(char *)NULL); error_cs("Fallo al mutar a ps"); }else if (pid_ps<0) error_cs("Error en el primer fork (PS)"); pid_grep=fork(); if (pid_grep==0){ // El hijo mutará a grep execlp("grep","grep",argv[1],(char *)NULL); error_cs("Error al mutar a grep"); }else if (pid_grep<0) error_cs("Error en el segundo fork(GREP)"); while(waitpid(-1,NULL,0)>0); // El padre simplemente esperará }

PASO 2: Creamos la pipe Necesitamos un vector de 2 enteros void main(int argc,char *argv[]) { int pid_ps,pid_grep, p[2]; if (argc!=2) usage(); pipe(p); // Creamos la pipe antes del ps y el grep pid_ps=fork(); if (pid_ps==0){ // El hijo mutará a ps execlp("ps","ps","-A",(char *)NULL); error_cs("Fallo al mutar a ps"); }else if (pid_ps<0) error_cs("Error en el primer fork (PS)"); pid_grep=fork(); if (pid_grep==0){ // El hijo mutará a grep execlp("grep","grep",argv[1],(char *)NULL); error_cs("Error al mutar a grep"); }else if (pid_grep<0) error_cs("Error en el segundo fork(GREP)"); while(waitpid(-1,NULL,0)>0); // El padre simplemente esperará } Necesitamos un vector de 2 enteros P[0] tendrá el canal de lectura y p[1] el de escritura

PASO 3: Redireccionar canales(ps) El proceso ps escribirá en el canal 1 El canal 1 debe estar vinculado a la pipe ps 1 … if (pid_ps==0){ // El hijo mutará a ps dup2(p[1],1); execlp("ps","ps","-A",(char *)NULL); error_cs("Fallo al mutar a ps"); }else if (pid_ps<0) error_cs("Error en el primer fork (PS)"); Si el canal 1 estaba activo (lo normal), primero se cierra Después se copia el contenido de la tabla de canales de la entrada p[1] en la entrada 1

PASO 4: cerrar canales(ps) El proceso ps solo necesita el canal 1 ps 1 … if (pid_ps==0){ // El hijo mutará a ps dup2(p[1],1); close(p[0]);close(p[1]); execlp("ps","ps","-A",(char *)NULL); error_cs("Fallo al mutar a ps"); }else if (pid_ps<0) error_cs("Error en el primer fork (PS)"); Antes de mutar!!!!!!

PASO 3: Redireccionar canales(grep) El proceso grep leerá en el canal 0 El canal 0 debe estar vinculado a la pipe grep … if (pid_grep==0){ // El hijo mutará a grep dup2(p[0],0); execlp(“grep",“grep",argv[1],(char *)NULL); error_cs("Fallo al mutar a grep"); }else if (pid_grep<0) error_cs("Error en el segundo fork (GREP)"); Si el canal 0 estaba activo (lo normal), primero se cierra Después se copia el contenido de la tabla de canales de la entrada p[0] en la entrada 0

PASO 4: cerrar canales(grep) El proceso grep solo necesita el canal 0 grep … if (pid_grep==0){ // El hijo mutará a grep dup2(p[0],0); close(p[0]);close(p[1]); execlp(“grep",“grep",argv[1],(char *)NULL); error_cs("Fallo al mutar a grep"); }else if (pid_grep<0) error_cs("Error en el segundo fork (GREP)"); Antes de mutar!!!!!!

PASO 5: cerrar canales (padre) void main(int argc,char *argv[]) { int pid_ps,pid_grep, p[2]; if (argc!=2) usage(); pipe(p); // Creamos la pipe antes del ps y el grep pid_ps=fork(); if (pid_ps==0){ // El hijo mutará a ps ……. }else if (pid_ps<0) error_cs("Error en el primer fork (PS)"); pid_grep=fork(); if (pid_grep==0){ // El hijo mutará a grep ….. }else if (pid_grep<0) error_cs("Error en el segundo fork(GREP)"); close(p[0]);close(p[1]); while(waitpid(-1,NULL,0)>0); // El padre simplemente esperará } El padre no usa la pipe Antes del waitpid!!!!

Veremos como afecta a las estructuras de datos Probad el código!!! Veremos como afecta a las estructuras de datos

¿Como afecta a las estructuras de datos? Suponed que el programa se llama ps_grep y lo lanzamos asi: ps_grep bash La entrada y salida std por defecto será la consola (“tty” en la tabla) Ent.; refs. Inodo; Ent.; refs. Modo; l/e; Ent. T.Inodo Canal; entrada_tfo 3 RW - 1 2 4 5 1 “tty” 2 1 2 3 4 T.Canales Proceso inicial Tabla Ficheros Abiertos

Estado inicial: comentarios Tenemos tres canales ocupados: 0, 1 y 2 que corresponden con los canales de la entrada/salida/salida error std Como la entrada/salida/salida error std. Asumimos que es la consola, podemos hacer que apunte a una única entrada de la TFO Referencias=3 porque hay tres canales en total apuntando a ella Como es de lectura/escritura el modo es RW Como la consola no es un fichero de datos, no ofrece un acceso secuencial a la información, por lo tanto no ponemos un valor en la posición de l/e Usamos la entrada 0 de la tabla de inodos En la T. inodos deberíamos poner el número de inodo, pero en los casos que tengamos información del sistema de fichero lo simplificaremos con una etiqueta tipo “consola” o “pipe”

Ejecución concurrente Los tres procesos estará ejecutándose a la vez, las modificaciones que pondremos aquí corresponden a una posible secuencia Por simplicidad asumiremos que primero se ejecuta el padre, luego añadiremos las modificaciones del proceso del ps y luego las del grep. La tabla de canales está en el PCB, pero por simplicidad pintamos solo la tabla de canales Cada vez que hagamos un fork: Hemos de añadir una nueva tabla de canales Será una réplica de la de su padre Habrá que actualizar el contador de referencias

Secuencia del padre pipe(p); fork(); fork() close(p[0]);close(p[1]); while(waitpid(-1,null,0)>0);

1. Creamos la pipe Hemos de añadir 1 entrada en la T.Inodos, 2 entradas en la TFO y 2 canales. Primero el acceso de lectura y luego el de escritura. Ent.; refs. Inodo; Ent.; refs. Modo; l/e; Ent. T.Inodo Canal; entrada_tfo 3 RW - 1 R 2 W 4 5 1 “tty” 2 “pipe” 1 2 3 4 T.Canales Proceso inicial Tabla Ficheros Abiertos

2.3. Fork: no modifica la tabla de canales del padre Ent.; refs. Inodo; Ent.; refs. Modo; l/e; Ent. T.Inodo Canal; entrada_tfo 9 RW - 1 3 R 2 W 4 5 1 “tty” 2 “pipe” Proceso inicial 1 2 3 4 Canal; entrada_tfo Canal; entrada_tfo Proceso “ps” 1 2 3 4 Proceso “grep” 1 2 3 4

4. Cierra los canales : close(3);close(4) Ent.; refs. Inodo; Ent.; refs. Modo; l/e; Ent. T.Inodo Canal; entrada_tfo 9 RW - 1 3 2 R 2 W 3 4 5 1 “tty” 2 “pipe” Proceso inicial 1 2 3 4 Canal; entrada_tfo Canal; entrada_tfo Proceso “ps” 1 2 3 4 Proceso “grep” 1 2 3 4

Secuencia ps dup2(p[1],1);  dup2(4,1) Cierra el canal 1  actualizar contador de referencias Copia el canal 4 en la salida1  actualizar contador referencias close(p[0]);close(p[1]);  close(3); close(4); Actualizar contador de referencias execlp(“ps",“ps",”-A”,(char *)NULL); No afecta a la tabla de canales, solo es un cambio del binario

1. Cambios proceso PS: dup2(4,1) Ent.; refs. Inodo; Ent.; refs. Modo; l/e; Ent. T.Inodo Canal; entrada_tfo 9 8 RW - 1 2 R 2 3 W 3 4 5 1 “tty” 2 “pipe” Proceso inicial 1 2 3 4 Canal; entrada_tfo Canal; entrada_tfo Proceso “ps” 1 0 2 2 3 4 Proceso “grep” 1 2 3 4

2. Cambios proceso PS: close(3);close(4); Ent.; refs. Inodo; Ent.; refs. Modo; l/e; Ent. T.Inodo Canal; entrada_tfo 8 RW - 1 2 1 R 2 3 2 W 3 4 5 1 “tty” 2 “pipe” Proceso inicial 1 2 3 4 Canal; entrada_tfo Canal; entrada_tfo Proceso “ps” 1 2 3 4 Proceso “grep” 1 2 3 4

Secuencia grep dup2(p[0],0);  dup2(3,0) Cierra el canal 0  actualizar contador de referencias Copia el canal 3 en la entrada 0  actualizar contador referencias close(p[0]);close(p[1]);  close(3); close(4); Actualizar contador de referencias execlp(“grep",“grep",argv[1],(char *)NULL); No afecta a la tabla de canales, solo es un cambio del binario

1. Cambios proceso grep: dup2(3,0); Ent.; refs. Inodo; Ent.; refs. Modo; l/e; Ent. T.Inodo Canal; entrada_tfo 8 7 RW - 1 1 2 R 2 W 3 4 5 1 “tty” 2 “pipe” Proceso inicial 1 2 3 4 Canal; entrada_tfo Canal; entrada_tfo Proceso “ps” 1 2 3 4 Proceso “grep” 0 1 1 2 3 4

2. Cambios proceso grep: close(3);close(4); Ent.; refs. Inodo; Ent.; refs. Modo; l/e; Ent. T.Inodo Canal; entrada_tfo 7 RW - 1 2 1 R 2 W 3 4 5 1 “tty” 2 “pipe” Proceso inicial 1 2 3 4 Canal; entrada_tfo Canal; entrada_tfo Proceso “ps” 1 2 3 4 Proceso “grep” 1 2 3 4

Este es el estado cuando el proceso padre está en el waitpid y los hijos están haciendo el ps y el grep Ent.; refs. Inodo; Ent.; refs. Modo; l/e; Ent. T.Inodo Canal; entrada_tfo 7 RW - 1 R 2 W 3 4 5 1 “tty” 2 “pipe” Proceso inicial 1 2 3 4 Canal; entrada_tfo Canal; entrada_tfo Proceso “ps” 1 2 3 4 Proceso “grep” 1 2 3 4

Finalización de procesos El primero en acabar será el ps y luego el grep, ya que uno produce datos y el otro los lee. ¿ Como estarán las tablas cuando solo quede el padre justo después del waitpid? Ent.; refs. Inodo; Ent.; refs. Modo; l/e; Ent. T.Inodo Canal; entrada_tfo 3 RW - 1 2 4 5 1 “tty” 2 Proceso inicial 1 2 3 4 Cuando un proceso termina se cierran todos los canales que le queden abiertos