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:
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.
#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
#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.
https://www.youtube.com/embed/z-xGk9c_eOw Guionista y locutor: Manuel Ignacio López Quintero.Fecha de publicación: 31 de diciembre de 2024.
Ver comentarios
Siempre he usado comunicación de procesos usando sockects del sistema, ¿qué diferencia tiene este método en cuanto a ventajas o inconvenientes?
¿Para qué recomendarías unos y otros?
Es cierto las named pipes y los unix sockets tienen un funcionamiento muy similar, ambos comunican procesos en la misma maquina, ambos leen y escriben..
Named Pipes (FIFO) Unix Sockets
- Facil implementacion - Un poco mas complicado de implementar
- Unidireccionales(bidireccional
si se crean dos pipes) - Bidireccionales
- Solo comunica dos procesos - Comunica mas de 2 procesos (servidor procesa
multiples clientes)
- Solo envian por stream - Pueden enviar stream de bytes o por datagramas
Para que te recomiendo uno u otro?
Pues eso depende mucho de que es lo que vas a realizar y tus necesidades, aunque en la mayoria de los casos te diria que es conveniente utilizar unix sockets, aunque tambien recordar que existen varias tecnicas para comunicar procesos, por ejemplo si lo que quieres es velocidad te recomiendo el metodo de memoria compartida.(luego hago algo de unix sockets o shared memory)
También conocía ese método :), shmat() y compañía, sorprendente lo que uno aprende gracias a autores como tú.
Suponía que este método podía existir, de hecho, podrías hasta crear un método "a mano" pero tal como lo explica con esa metodología es mucho mejor.