comunicacion entre procesos namedpipes

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

Comunicación

Instalar y configurar servidor TFTP en Ubuntu

Es muy frecuente que los equipos de comunicaciones como los controladores WiFi, los switches de cierto nivel o los cortafuegos, soporten protocolo TFTP (no confundir con FTP) para poder subir configuraciones o hacer respaldos. Puesto que no es tan frecuente el uso de este FTP Trivial como se llama, os  traigo un manual de cómo poner a punto un servidor TFTP en tu equipo con Linux (más concretamente he usado para las pruebas Ubuntu 11.10).

Instalación de los paquetes

Para administrar el servicio usaremos xinetd, así que además de los paquetes propios de TFTP instalaremos a este (atentos al -y que asume que sí a todas las peticiones y no pregunta):

sudo apt-get install xinetd tftpd tftp -y

Configuración

Una vez instalado, creamos el fichero tftp dentro de /etc/xinetd.d/. Por ejemplo:

sudo vi /etc/xinetd.d/

Dentro del fichero indicamos:

service tftp
{
   protocol = udp
   port = 69
   socket_type = dgram
   wait = yes
   user = nobody
   server = /usr/sbin/in.tftpd
   server_args = var/lib/tftpboot -s
   disable = no
}

Como podéis ver, estamos estableciendo un directorio raíz para el servidor, en concreto, /var/lib/tftpboot por lo que deberemos crearlo y darle los permisos, usuarios y grupos oportunos:

sudo mkdir /var/lib/tftpboot
sudo chown -R nobody:nobody /var/lib/tftpboot
sudo chmo7 -R 777 /var/lib/tftpboot

Si os da error de grupo no existente, lo creamos:

sudo addgroup nobody

Reinicamos xinetd para que los cambios surtan efecto:

sudo service xinetd stop
sudo service xinetd start

Pruebas

Pasamos a la parte de las pruebas. Primero intentamos subir un fichero a nuestro servidor. La idea es la siguiente:

  • Tenemos un fichero: foto.jpg en nuestro escritorio
  • La subo al servidor
  • Debe aparecer la foto en el directorio que hemos creado

Los pasos a dar son los siguientes. Comenzamos por iniciar sesión con el cliente de consola en el servidor, paso seguido subimos el fichero y salimos:

tftp localhost
tftp> put foto.jpg
q

La idea es comprobar que el fichero se ha subido al directorio oportuno. Ahora para completar la prueba hacemos el proceso inverso:

cd cualquier_otro_directorio
tftp localhost
tftp> get foto.jpg

La foto debe estar en ese otro directorio.

Posibles problemas

Os comento algunos problemas que pueden apareceros:

  • Error code 2: Access violation
  • File not found

A priori con el tema de los permisos no deberían salir, pero si aún así, si tenéis problemas, vía comentarios de esta entrada podemos ir resolviéndolos.