Tuberías - Braulio J. Solano Rojas

Anuncio
Tuberías
CI-2400 Programación Avanzada en
Sistemas de Tipo UNIX
Prof. Braulio José Solano Rojas
ECCI, UCR
Tuberías
●
●
Las tuberías son uno de los primeros
mecanismos que se implantaron en UNIX para
la comunicación entre procesos.
De hecho, algunos sistemas monoproceso,
como por ejemplo DOS permiten en la línea
de comandos la utilización de tuberías.
2 de 16
Tuberías anónimas
●
●
Las tuberías anónimas se crean con la función pipe y
solamente el proceso creador y sus descendientes pueden
utilizarlas.
int pipe(int fildes[2]);
Vamos a poder utilizar la tubería por medio del arreglo fildes.
Al escribir en fildes[1] se introducen datos en la tubería y al
leer de fildes[0] se leen datos de la tubería. La tubería se
trata como un archivo por lo que tendrá un inode.
3 de 16
Comunicación bidireccional
●
●
●
Uno de los problemas que presenta utilizar una
única tubería es la falta de comunicación entre el
hijo y el padre.
Podríamos creer que podemos utilizar una única
tubería para la comunicación bidireccional pero
nos veríamos con problemas de sincronización.
Por lo tanto, lo mejor es valernos de dos tuberías.
4 de 16
Tuberías en los intérpretes de
comandos
●
●
●
Todos los intérpretes de comandos ofrecen la
posibilidad de redirigir tanto la entrada como la
salida de la ejecución de un programa.
Mediante las tuberías conseguimos que la salida
de un programa se convierta en la entrada de otro.
Ejemplo, listado de directorio en orden reverso:
$ ls | sort -r
5 de 16
Tuberías en los intérpretes de
comandos
●
Para formar parte de una tubería tal y como las
manejan los shell se han de cumplir dos
requisitos.
●
●
La entrada de datos al programa se debe realizar a
través del archivo estándar de entrada (descriptor de
archivo número 0).
La salida de datos se debe realizar a través del archivo
estándar de salida (descriptor de archivo número 1).
6 de 16
Tuberías con nombre (FIFO)
●
●
Para los procesos que no guardan ninguna
relación de parentesco se debe recurrir a las
tuberías con nombre o fifo.
Un fifo es un archivo con la misma semántica
que una tubería anónima, pero ocupa una
entrada en un directoria y se accede a el por
medio de un path.
7 de 16
Tuberías con nombre (FIFO)
●
●
●
El comportamiento de un archivo fifo es un tanto
diferente a un archivo ordinario.
Cuando se abre un fifo para escritura el proceso se
pone a dormir hasta que no haya otro proceso que lo
abra para lectura y viceversa.
Para los fifo el kernel solamente utiliza las direcciones
de bloques directas del inode, por lo que la cantidad
de datos es limitada.
8 de 16
Tuberías con nombre (FIFO)
●
●
El kernel maneja dos punteros al fifo uno de
lectura y otro de escritura, además las
direcciones directas son consideradas como
una lista circular.
Para poder abrir un fifo este debe existir a
priori.
9 de 16
Creación de fifo
●
Ejemplo, creación de fifo_1:
●
Método 1:
$ mknod fifo_1 p
●
Método 2:
if (mknod("fifo_1", S_IFIFO | permisos, 0) == -1)
{
/* Error al crear el fifo. */
}
10 de 16
Creación de fifo
●
FreeBSD
●
●
Solaris
●
●
mkfifo [-m] nombretuberia
mkfifo [-m] nombretuberia
Linux
●
●
mknod nombretuberia p
mkfifo [-m] nombretuberia
11 de 16
Comunicación full-duplex
●
●
En los casos anteriores la comunicación ha sido
half-duplex.
Tres técnicas van a permitir este tipo de
comunicación:
●
●
●
Polling o interrogación periódica.
Lectura conducida por eventos.
Multiplexación mediante select.
12 de 16
Interrogación periódica
●
●
●
Consiste en hacer un recorrido periódico interrogando
sobre las distintas fuentes.
Deben haber funciones que indiquen el estado de las
fuentes.
En el caso de los fifo, al no haber este tipo de
funciones se interroga leyendo. Para no tener
bloqueo se utiliza el flag O_NDELAY o se activa
utilizando fcntl.
13 de 16
Lectura conducida por eventos
●
Habrá un proceso por origen de datos. El
proceso principal estará detenido todo el
tiempo y solamente cuando alguno de sus
hijos asociados a los orígenes de datos le
comuniquen un evento, tomará el control y
leerá del dispositivo correspondiente.
14 de 16
Referencias
●
●
Introduction to Named Pipes – Linux Journal
The lost art of named pipes – TechTarget
¡Gracias por su atención!
¿Preguntas?
Descargar