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.