¿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.
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:
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ónsigint_handler
, que primero cierra el “named pipe” y luego sale del programa utilizandoexit(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>