You are on page 1of 3

Universidad Mesoamericana Amatitlan Departamento de Informatica Ing.

Gustavo Villeda

Automatas y Lenguajes Formales Tarea Algoritmo y Diagrama

Alexander Morales 1000006-UPA


25 de Julio de 2011

Tuberas Con Nombre

Las tuberas con nombre son un mtodo de comunicacin FIFO entre procesos (tambin se les llama FIFOs). FIFO son las siglas de First In First Out, es decir, el primero que llega es que primero que se marcha, como en una cola, el primero que llega es el que antes termina. Lo que hacen las macros depura_int y depura_string, nos darn el nmero de lnea y el archivo donde estn, as como el nombre de la variable y el valor que tiene en ese momento. Normalmente las tuberas son annimas, aunque el hecho de tenerlas con un nombre en nuestro sistema de ficheros puede sernos de gran utilidad. Primero vemos el terminal de abajo, en el que se ejecuta lo siguiente:

$ mkfifo prueb 1 a 2 $ cat prueba


Seguidamente en el otro terminal se escribe lo siguiente:

$ echo "Esto es una prueba">prueba

Automticamente el texto Esto es una prueba aparece en el primer terminal. Hemos logrado enviar un mensaje! De la misma forma podemos programar aplicaciones que utilicen estas caractersticas de forma muy fcil en casi cualquier lenguaje de programacin, para los ejemplos utilizar C. Debemos hacer dos programas, uno que escriba en la tubera (pipe) y otro que lea de ella. Empezamos por pipewrite.c:

#include <stdio.h> 1 #include <sys/types.h> 2 #include <sys/stat.h> 3 4 int main() 5 { 6 FILE *mipipe; 7 char buffer[128]; 8 int i=0; 9 10 if (mkfifo("pipetest", S_IWUSR | /* El usuario puede escribir */ 11 S_IRUSR | /* El usuario puede leer */ 12 S_IRGRP | /* El grupo puede leer */ 13 S_IROTH /* Otros pueden leer */ 14 )!=0) 15 printf ("Hubo un problema al crear la pipe\n"); 16 17 mipipe=fopen("pipetest", "w"); /* Lo abrimos como un fichero normal y 18 corriente */ 19 20 /* Con esta lnea leemos hasta que se cierre la tubera por el otro */ 21 22 while (i<10) 23 { 24 sprintf(buffer, "CADENA ENVIADA Nmero: %i\n", i+1); 25 fputs(buffer, mipipe); 26 i++; 27 } 28 29 fclose(mipipe); /* Cerramos la tubera por aqu tambin */

Y ahora pipecilla.c (o el programa que leer la pipe):

#include <stdio.h> 1 #include <sys/types.h> 2 #include <sys/stat.h> 3 4 int main() 5 { 6 FILE *mipipe; 7 char buffer[128]; 8 if (mkfifo("pipetest", S_IWUSR | /* El usuario puede escribir */ 9 S_IRUSR | /* El usuario puede leer */ 10 S_IRGRP | /* El grupo puede leer */ 11 S_IROTH /* Otros pueden leer */ 12 )!=0) 13 printf ("Hubo un problema al crear la pipe\n"); 14 15 mipipe=fopen("pipetest", "r"); /* Lo abrimos como un fichero normal y 16 corriente */ 17 18 /* Con esta lnea leemos hasta que se cierre la tubera por el otro */ 19 while (!feof(mipipe)) 20 { 21 if (fgets(buffer, 128, mipipe)) 22 printf ("RECIBIDO: %s", buffer); 23 } 24 25 fclose(mipipe); /* Cerramos la tubera por aqu tambin */ 26 }
Ahora compilamos y ejecutamos en terminales diferentes de nuevo: En el terminal de pipewrite.c, al ejecutar el programa da un mensaje de error, es porque la pipe ya existe (se cre en el programa anterior). Esta forma de comunicacin es unidireccional, puede ser ltil por ejemplo para publicar el estado de un programa (un reproductor de audio podra publicar la cancin que est sonando como en xmms-infopipe), o para modificar el comportamiento de un software mientras ste est en ejecucin. Pero si queremos que nuestras aplicaciones dialoguen (en full-duplex), debemos tener dos pipes simultneas, en ese caso, la aplicacin 1, por ejemplo deber leer en la tubera 1 y escribir en la tubera 2; y la aplicacin 2, deber escribir en la tubera 1 y leer en la tubera 2.

You might also like