Comunicacion entre Procesos con Named Pipes

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.

comunicacion entre procesos namedpipes