¿Qué son los FIFOs?
Los FIFOs (First In, First Out), también llamados tuberías con nombre (named pipes), son mecanismos de comunicación entre procesos independientes que no necesariamente tienen relación padre-hijo. A diferencia de las PIPEs anónimas, los FIFOs son entidades generadas por el sistema operativo que pueden ser utilizadas por cualquier proceso que conozca su nombre.
Crear un FIFO desde la línea de comandos
mknod nombreFichero p
El parámetro p indica que se trata de un FIFO (pipe con nombre).
Función mknod en C
int mknod(const char *pathname, mode_t modo, dev_t dev);
| Parámetro | Descripción |
|---|---|
pathname |
Nombre del fichero FIFO |
modo |
Permisos y tipo de nodo. Debe incluir S_IFIFO para crear un FIFO |
dev |
Ignorado para FIFOs (se pasa 0) |
Ejemplo: programa lector (crea el FIFO)
El proceso lector crea el FIFO y se queda en espera hasta que otro proceso escriba datos en él:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(void) {
int fp;
int p, bytesLeidos;
char buffer[10];
p = mknod("FIFO3", S_IFIFO | 0666, 0);
if (p == -1) {
printf("Ha ocurrido un error \n");
exit(0);
}
while (1) {
fp = open("FIFO3", 0);
bytesLeidos = read(fp, buffer, 1);
printf("Obteniendo información... \n");
while (bytesLeidos != 0) {
printf("%s", buffer);
bytesLeidos = read(fp, buffer, 1);
}
close(fp);
}
return 0;
}
Ejemplo: programa escritor
El proceso escritor abre el FIFO ya creado por el lector y escribe datos en él:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
int fp;
char saludo[] = "Un saludo!!!\n";
fp = open("FIFO3", 1);
if (fp == -1) {
printf("Error al abrir el fichero...\n");
exit(1);
}
printf("Mandando información al FIFO...\n");
write(fp, saludo, strlen(saludo));
close(fp);
return 0;
}
Flujo de ejecución
- Compilar y ejecutar primero el lector: crea el FIFO
FIFO3y se queda bloqueado esperando datos. - En otra terminal, compilar y ejecutar el escritor: abre el FIFO y escribe la cadena.
- El lector recibe los datos y los imprime por pantalla.
- El lector vuelve al inicio del bucle esperando la siguiente escritura.
Ejercicio propuesto
Crear tres procesos:
- Un proceso escritor que genera números y los escribe en un FIFO.
- Un proceso lector par que lee del FIFO y filtra solo los números pares.
- Un proceso lector impar que lee del FIFO y filtra solo los números impares.