Как корректно освободить ресурсы в вечно работающем приложении?
Перед завершение программы необходимо передавать потокам какой-либо сигнал о завершений, который они будут проверять на каждой итерации цикла и завершать его в случае необходимости, а закрытие файлов сделать после цикла.
В POSIX системах перед прибитием ОС должна посылать сигнал
https://ru.wikipedia.org/wiki/SIGTERM

В Windows есть  похожий механизм

Судя по тегу STM32, у вас какая то ОС установлена? Смотрите документацию по реализации TASK MANAGER  и SIGTERM  если реализован, то вставьте обработчик и в нем закрывайте файлы