es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo cerrar adecuadamente un FIFO (tubería nombrada) utilizado en un bucle infinito cuando el programa termina?

Estoy usando tuberías con nombre en un programa multiproceso que escribe/lee en/desde las tuberías en un bucle infinito y hace algo. Sé que esos FD deben cerrarse antes de salir del programa para que sigan funcionando correctamente, pero ¿cómo hacerlo en este caso? (Cuando digo terminar, me refiero a través de un proceso maestro, un CTRL+C, etc.)

Aquí hay un bosquejo del código (escritor):

....    
open(myfifo,O_WRONLY)
while(1){
     //OBTENER COMANDO DESDE ENTRADA
     fgets(buffer, 80, stdin);
     write(myfifo, buffer, 81);
}
}

Y aquí está el lector:

....
last_command = "0";
open(myfifo,O_RDONLY | O_NONBLOCK)
while(1){
   //SI HAY ALGO ESCRITO, TOMARLO
   if (read(myfifo, buffer, 81)>0){
       last_command = buffer;
   }
   hacer_algo(last_command);
}
}

Espero que esté claro.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para cerrar apropiadamente los “named pipes” y evitar problemas, puede utilizar el manejo de señales en su programa. Puede registrar una función de manejador de señal para manejar SIGINT (CTRL+C) y otras señales de terminación. En esta función, puede cerrar los “named pipes” antes de terminar el proceso.

    Aquí hay un ejemplo de cómo puede modificar su código para manejar señales:

    #include <stdio.h>
    #include <signal.h>
    #include <fcntl.h>
    #include <unistd.h>
    #include <stdlib.h>
    
    #define MAX_BUF 80
    
    int myfifo;
    void sigint_handler(int sig);
    
    int main()
    {
        signal(SIGINT, sigint_handler);
        char buffer[MAX_BUF];
        myfifo = open("myfifo", O_WRONLY);
        if (myfifo < 0) {
            perror("open");
            exit(1);
        }
        while (1) {
            // OBTENER COMANDO DE ENTRADA
            fgets(buffer, MAX_BUF, stdin);
            write(myfifo, buffer, MAX_BUF);
        }
        close(myfifo);
    }
    
    void sigint_handler(int sig)
    {
        close(myfifo);
        exit(0);
    }
    

    En este código, hemos registrado la función sigint_handler para manejar las señales SIGINT. Cuando se recibe una señal SIGINT, se llama a la función sigint_handler, que primero cierra el “named pipe” y luego sale del programa utilizando exit(0).

    De manera similar, puede modificar su código de lector para manejar señales y cerrar el “named pipe” antes de terminar el proceso.</stdlib.h></unistd.h></fcntl.h></signal.h></stdio.h>

Comments are closed.