Я делаю консольное приложение и хочу, чтобы моя программа выполняла некоторую очистку после закрытия консоли. Я много исследовал, но я не нашел хорошего ответа на этот вопрос
Дождитесь нажатия клавиши в конце main, затем выполните очистку. например std::cout << "Press enter to stop program...\n"; char c; std::cin >> c;
@Pep не совсем - предположим, он закрыт с помощью кнопки x или другими способами?
@NeilButterworth Хорошо, это другое дело :) И я думаю, что тогда это зависит от платформы. И я бы знал, как это сделать только для приложений Windows, а не для консольных приложений.
Создайте службу, которая сможет работать после закрытия консольного приложения.
Пожалуйста, будьте более конкретными. Что именно вы хотите очистить? Является ли это «консольным приложением», как в приложении, которое имеет собственную консоль, или приложение, которое работает в консоли/терминале?
он работает в консоли Windows, и я хочу сделать некоторые вещи после того, как пользователь закроет консоль
SetConsoleCtrlHandler()
это именно то, для чего это нужно... но это дает вам только ограниченное время, прежде чем ваш процесс все равно будет завершен. Немедленно выполните наиболее важные действия по очистке и не позволяйте другим вещам потерпеть неудачу. За исключением обработчика, когда пользователь закрывает консоль в Windows, это, к сожалению, то же самое, что и команда процесса уничтожения.
о, спасибо, это именно то, что мне было нужно
Есть много способов завершить процесс — закрытие окна консоли — только один из них. В общем, вы не можете полагаться на возможность очистки при закрытии. Альтернативой является очистка в процессе работы и/или очистка остатков при следующем запуске.
Если вас беспокоит только закрытие ситуации с консолью. Вот пара вариантов для Windows. К сожалению, ни один из них не является тривиальным для реализации.
Вместо того, чтобы создавать консольное приложение, создайте приложение «Windows», которое не имеет графического интерфейса и вместо этого создает собственную консоль. Когда пользователь закроет эту консоль, процесс все еще будет работать. Я не могу вспомнить, есть ли способ прикрепить вашу программу «Windows» к консоли, с которой она была запущена. Если бы они были, я думаю, что Visual Studio использовала бы это, а не трюк devenv.com
и devenv.exe
.
Создайте консольное приложение, которое запускает вторую (неконсольную) программу. Второй процесс — это ваша основная программа, но он направляет свой вывод в консольное приложение (например, с использованием именованного канала). Точно так же консольное приложение должно будет направлять пользовательский ввод второму процессу. Если пользователь закрывает консоль (или консольное приложение), второй процесс может продолжать работать.
Также загляните в RAII. Используется с умом и все убирается за собой автоматически, за исключением случаев фатальной ошибки. И в случае фатальной ошибки, можете ли вы быть уверены, что система находится в достаточно хорошем состоянии для правильной очистки?
ну что ты нашел в своих поисках?