Crear cola FIFO en lenguaje C en Linux

Crear una cola FIFO en lenguaje C

Las colas (queue) son estructuras de datos abstractas en informática que siguen el principio FIFO (First In, First Out), es decir, el primer elemento en entrar es el primero en salir. Se pueden comparar con una fila en la vida real, donde las personas se atienden en el orden en que llegaron. Vamos al grano a crear una cola FIFO en lenguaje C en LInux.

Esta actividad es meramente conceptual, didáctica, en la que mostramos el funcionamiento de una cola FIFO. Se trata de cuatro archivos: dos programas escritos en C, un archivo de texto llamado estado.txt y un archivo especial llamado “mi_fifo”.

Cola FIFO en lenguaje C en Linux


El primer programa lee el contenido de “estado.txt” y transfiere lo que lee al segundo programa por medio del archivo especial mi_fifo. Finalmente el programa 2 nos muestra en pantalla lo que recibe del FIFO.

programa_1.c (Programa 1)

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/stat.h>
#include <signal.h>

#define ARCHIVO "estado.txt"
#define FIFO "mi_fifo"

void handle_sigpipe(int sig) {
    fprintf(stderr, "Señal SIGPIPE recibida. La tubería puede haber sido cerrada.\n");
    // No exit aquí para que el proceso pueda seguir intentando o reiniciar
}

int main() {
    char estado;
    int archivo_fd, fifo_fd;

    // Establecer el manejador de la señal SIGPIPE
    signal(SIGPIPE, handle_sigpipe);

    // Crear la tubería de nombre (FIFO) si no existe
    if (mkfifo(FIFO, 0666) == -1 && errno != EEXIST) {
        perror("mkfifo");
        exit(EXIT_FAILURE);
    }

    // Abrir el archivo para lectura
    archivo_fd = open(ARCHIVO, O_RDONLY);
    if (archivo_fd < 0) {
        perror("open");
        exit(EXIT_FAILURE);
    }

    // Abrir el FIFO para lectura y escritura
    fifo_fd = open(FIFO, O_RDWR);
    if (fifo_fd < 0) {
        perror("open FIFO");
        close(archivo_fd);
        exit(EXIT_FAILURE);
    }

    while (1) {
    // Leer el estado del archivo
        ssize_t bytes_read = read(archivo_fd, &estado, 1);
        if (bytes_read != 1) {
            if (bytes_read < 0) {
                perror("read");
            }
        close(archivo_fd);
        close(fifo_fd);
        exit(EXIT_FAILURE);
    }

    // Intentar escribir el estado en la tubería de nombre
    ssize_t bytes_written = write(fifo_fd, &estado, 1);
    if (bytes_written != 1) {
        if (errno == EAGAIN) {
        // FIFO está lleno o el lector no está disponible, puedes manejarlo aquí
            fprintf(stderr, "FIFO está lleno o el lector no está disponible\n");
            sleep(1); // Esperar un momento antes de intentar de nuevo
        } else {
            perror("write FIFO");
            close(archivo_fd);
            close(fifo_fd);
            exit(EXIT_FAILURE);
        }
    }

    // Posicionar el puntero del archivo al inicio (si es necesario)
    lseek(archivo_fd, 0, SEEK_SET);

    // Esperar un poco antes de volver a leer (opcional)
    sleep(1); // Ajusta el tiempo de espera según tus necesidades
}

// Cerrar los descriptores
close(archivo_fd);
close(fifo_fd);

return 0;
}

programa_2.c (Programa 2)

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>

int main() {

    charestado;
    // Leer del pipe (que ahora es la entrada estándar)
    while (1) {
        ssize_tbytes_read=read(STDIN_FILENO, &estado, 1);
        if (bytes_read!=1) {
            if (bytes_read<0) {
                perror("read");
            }

            exit(EXIT_FAILURE);
        }

    // Mostrar el estado recibido
        printf("El estado recibido es: %c\n", estado);
    }

return0;

}
El archivo especial llamado “mi_fifo” lo creamos con el comando Linux mkfifo:
mkfifo mi_fifo
Para revisar su funcionamiento, abrimos dos consolas de terminal y ejecutamos ambos programas en cada consola.
Si ejecutamos a programa_1 de primero, y al cabo de un rato (uno 15 segundos) ejecutamos a programa_2, podremos ver que la consola de programa_2 se satura con todos los datos que se acumularon en el FIFO durante esos 15 segundos.
Y eso es todo.
Comparte esto en
Publicado en Desarrollo Web.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *