hakain
@hakain
Немного знаю С/С++, Qt, и микроконтроллеры

Как корректно освободить ресурсы в вечно работающем приложении?

Как правильно освобождать ресурсы в приложении, которое должно работать с момента запуска устройства до выключения? В моем случае приложением является некий драйвер. С одной стороны можно и не освобождать - при закрытии приложения файлы закроются, а все потоки будут прибиты операционной системой, с другой - так делать все таки неправильно, поскольку я чувствую, что я потенциально зарядил ружье и направил на свою ногу.

void* first_thread (void* arg)
{
	int fd = open("/path/to/file", O_RDWR);
	// ...
	while (true) {
		// work with file
	}
}

void* second_thread (void* arg)
{
	int fd = open("/path/to/second_file", O_RDWR);
	// ...
	while (true) {
		// work with file
	}
}

int main(int argc, char *argv[])
{
	pthread_create(NULL, NULL, first_thread, NULL);
	pthread_create(NULL, NULL, second_thread, NULL);

	return foo(argc, argv); // тут что то продолжаем делать и приложение при этом не завершается
}


В какой момент закрывать файлы и завершать потоки?
  • Вопрос задан
  • 180 просмотров
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега C
Седой и строгий
Перед завершение программы необходимо передавать потокам какой-либо сигнал о завершений, который они будут проверять на каждой итерации цикла и завершать его в случае необходимости, а закрытие файлов сделать после цикла.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
В POSIX системах перед прибитием ОС должна посылать сигнал
https://ru.wikipedia.org/wiki/SIGTERM

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

Судя по тегу STM32, у вас какая то ОС установлена? Смотрите документацию по реализации TASK MANAGER и SIGTERM если реализован, то вставьте обработчик и в нем закрывайте файлы
Ответ написан
mayton2019
@mayton2019
Bigdata Engineer
Поскольку речь идет о языке "C" - то надо корректно обрабатывать ошибки open/read/write/fseek/close и реагировать на них. И закрывать файловые хендлы при любом возможном исходе. Ну и не забывать делать free() после malloc(). Грубо говоря количество malloc должно быть всегда равно free.

Если была смерть posix-потока то надо как-то найти все брошеные дескрипторы-сироты и закрыть их тоже. Тоесть процесс-родитель должен как-то их видеть.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы