Actualizado el 21 de Marzo del 2018 (Publicado el 23 de Febrero del 2018)
882 visualizaciones desde el 23 de Febrero del 2018
184,7 KB
19 paginas
Creado hace 18a (19/12/2006)
Tema 5 : Comunicación entre Procesos
mediante Tuberías
Sistemas Operativos:
Programación de Sistemas
Oscar Déniz Suárez
Alexis Quesada Arencibia
Francisco J. Santana Pérez
Curso 2006-07
Introducción
Algunas aplicaciones involucran más de
un proceso
Necesidades de comunicación y
sincronización
Algunos mecanismos básicos que nos
permiten comunicar y sincronizar
procesos son …
Introducción
Los mecanismos de comunicación a emplear
dependen del escenario en que nos
encontremos
Consideramos dos situaciones:
Los procesos se ejecutan en una misma máquina
Los procesos se ejecutan en máquinas diferentes
Introducción
Estudiaremos:
Tuberías (pipes) y FIFOs
Mecanismos IPC (Inter-Process Communication)
aparecidos con UNIX System V:
• Semáforos
• Memoria compartida
• Colas de mensajes
Sockets
Tuberías sin nombre (pipes)
El método más básico para comunicación entre
procesos
Creación de una tubería sin nombre
#include <stdio.h>
int pipe (int fildes[2]);
pipe crea una tubería donde:
fildes[0] es un descriptor de un fichero de sólo
lectura de la tubería
fildes[1] es un descriptor de un fichero de sólo
escritura en la tubería
Lo que se escribe en fildes[1] se lee en fildes[0]
Tuberías sin nombre (pipes)
Ventaja:
Fácil manejo de la tubería (mismo
tratamiento que un fichero: read, write, close)
Limitaciones:
Solo permiten comunicaciones de tipo half
duplex
Sólo pueden ser usadas entre procesos
relacionados (aquellos que tienen un
ancestro en común)
Tuberías sin nombre (pipes)
Normalmente, un proceso crea una tubería y luego
ejecuta la llamada fork
Como los descriptores de fichero se heredan de padres a hijos
….
En general, después de fork y pipe:
El proceso de lectura cierra el lado de escritura de la tubería
El proceso de escritura cierra el lado de lectura de la tubería
(operaciones de lectura y escritura)
A continuación suele venir el intercambio de datos
Y finalmente el proceso de cierre
Tuberías sin nombre (pipes)
La tubería usa un buffer gestionado por el
núcleo
La sincronización entre los accesos de escritura
y lectura la lleva a cabo el núcleo
Cuando el buffer está lleno, la llamada write se
bloquea
bloquea
Cuando el buffer está vacío, la llamada read se
También es el núcleo el encargado de
gestionar la tubería según una política FIFO
Tuberías sin nombre (pipes)
Si se intenta escribir cuando el extremo
lector ha cerrado se genera la señal
SIGPIPE
Cuando se cierra el extremo escritor, se
recibe un EOF tras la recepción de los
últimos datos
Tuberías sin nombre (pipes)
Ejercicio práctico:
Vamos a crear un proceso padre que se
encargue de leer mensajes de la entrada
estándar y se los pase a un proceso hijo que
los presentará por pantalla. El ciclo terminará
cuando el padre envíe la cadena “FIN” al
proceso hijo
Tuberías sin nombre (pipes)
Para la comunicación bidireccional entre
dos procesos podemos usar dos tuberías
Proceso A
Tub. AB
Tub. BA
Proceso B
Tuberías con nombre (FIFO)
Permiten comunicación entre dos procesos
Son un tipo especial de fichero, con una
cualesquiera, entre los que no hay relación de
parentesco
entrada en un directorio
Son persistentes, es decir, existen en el sistema de
También se conocen como tuberías FIFO (First
archivos
In First Out)
Tuberías con nombre (FIFO)
Desde el shell podemos crear tuberías con
nombre con la orden mkfifo
Ejercicio práctico:
Abrir un shell, crear una tubería con el nombre
En un shell, mostrar los datos escritos en la tubería
“pruebafifo” y listar los permisos
desde otro shell a través de la entrada estandar
Tuberías con nombre (FIFO)
Creación de una tubería con nombre
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo (const char *pathname, mode_t mode);
donde:
pathname: ruta de la tubería con nombre que se va
a crear
mode: máscara de permisos
Tuberías con nombre (FIFO)
Ejercicio práctico:
Crear una tubería con nombre desde un programa
(el nombre de la tubería se pasa como parámetro al
programa)
Comprobarlo desde un shell (nombre y permisos)
Volver a lanzar el mismo programa, ¿Qué ocurre?
Tuberías con nombre (FIFO)
Apertura, cierre, eliminación, lectura y escritura en una
tubería con nombre
Equivalente a las operaciones sobre ficheros
open, close, unlink, read y write
Con algunas diferencias
Apertura bloqueante
• open(“fifo_ejemplo”,O_WRONLY) => el proceso escritor se
bloquea hasta hasta que no haya otro proceso que abra la tubería
para leer de ella
• open(“fifo_ejemplo”,O_RONLY) => el proceso lector se bloquea
hasta que no haya otro proceso que abra la tubería para escribir
en ella
Esto es así a menos que se indique en la apertura el
modificador O_NONBLOCK
Tuberías con nombre (FIFO)
Apertura con el modificador
O_NONBLOCK
Si se especifica, un open de solo lectura
retorna inmediatamente
Un open de solo escritura retorna un error si
ningún proceso tiene la FIFO abierta para
lectura
Tuberías
En algunas ocasiones puede que sólo exista
un lector y un escritor
La constante PIPE_BUF define el número
máximo de caracteres que se pueden escribir
en una tubería atómicamente
Sin embargo, esto no es una imposición. Puede
haber muchos lectores y escritores
En este caso es necesario implementar mecanismos
para coordinar su uso
Tuberías con nombre (FIFO)
Ejercicio práctico:
Escribir un programa que lea de una tubería
con nombre “pruebaFIFO” y muestre lo leído
por pantalla
Escribir otro programa que cada 5 segundos
envíe a la tubería “pruebaFIFO” su pid y la
hora
Lanzar varias instancias del programa
escritor en diferentes ventanas
Comentarios de: Tema 5 - Comunicación entre procesos mediante tuberías - Sistemas Operativos: Programación de Sistemas (0)
No hay comentarios