Comunicacion entre Procesos con Named Pipes

Las “Named Pipes” o “Tuberias Nombradas” son el nombre de una tecnica para lograr realizar una comunicacion entre procesos, a esto se le conoce como IPC (Inter Process Communication). Permite a dos procesos en una misma maquina o de diferentes maquinas conectadas compartir mensajes entre procesos para comunicarse, esto es necesario en ocasiones en sistemas multitarea o multiproceso.
Las principales caracteristicas de una tuberia nombrada son:
- Existen en el sistema como un archivo especial.
- Los procesos de diferentes padres pueden compartir datos.
- Cuando se realizan todas las operaciones permanece en el sistema (a menos que se especifique lo contrario)
- Deben tener un lector y un escritor
Vamos a realizar un ejemplo en el que crearemos 2 sencillos programas en C en el que crearemos una tuberia, uno escribira en ella y otro leera de ella. Se compartira un mensaje de texto que sera mostrado en pantalla a traves de la terminal.
- Clase Escritora
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
int main(){
int t;
char *tuberia = "/tmp/tuberia";
/*crea un nuevo archivo fifo especial,
incluye una ruta y un parametro con una
mascara de permisos.
*/
mkfifo(tuberia,0666);
/*
abrimos una nueva tuberia
O_RDONLY - Abrir para solo lectura
O_WRONLY - Abrir para solo escritura
O_RDWR - Abrir para lectura / escritura
O_APPEND - Agrega al final del Archivo
...
*/
t = open(tuberia,O_WRONLY);
//escribimos el mensaje que compartiremos
write(t,"Mensaje entre Procesos",sizeof("Mensaje entre Procesos"));
//cerramos la tuberia
close(t);
//borramos
unlink(tuberia);
return 0;
}Compilamos:
sudo gcc -o writer writer.c
- Clase Lectora
#include <fcntl.h>
#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>
#define MAX_BUF 1024
int main(){
int t;
char *tuberia = "/tmp/tuberia";
char msj[MAX_BUF];
//abre la tuberia
t = open(tuberia,O_RDONLY);
//lee el mensaje desde la tuberia y lo almacena
read(t,msj,MAX_BUF);
//imprime el valor que comparte el otro proceso
printf("Recibido: %sn",msj);
//cerramos el tubo
close(t);
return 0;
}Compilamos:
sudo gcc -o reader reader.c
Abrimos 2 terminales y ejectamos el writer en una y el reader en otra.
sudo ./writer
sudo ./reader
y vemos el resultado, al ejecutar writer y despues reader en terminales distintas, aparece el mensaje que colocamos en writer en la terminal donde se ejecuta el programa reader.



