Как предотвратить полное завершение программы при закрытии консоли

Я делаю консольное приложение и хочу, чтобы моя программа выполняла некоторую очистку после закрытия консоли. Я много исследовал, но я не нашел хорошего ответа на этот вопрос

ну что ты нашел в своих поисках?

Neil Butterworth 31.01.2023 18:14

Дождитесь нажатия клавиши в конце main, затем выполните очистку. например std::cout << "Press enter to stop program...\n"; char c; std::cin >> c;

Pepijn Kramer 31.01.2023 18:14

@Pep не совсем - предположим, он закрыт с помощью кнопки x или другими способами?

Neil Butterworth 31.01.2023 18:15

@NeilButterworth Хорошо, это другое дело :) И я думаю, что тогда это зависит от платформы. И я бы знал, как это сделать только для приложений Windows, а не для консольных приложений.

Pepijn Kramer 31.01.2023 18:16

Создайте службу, которая сможет работать после закрытия консольного приложения.

crashmstr 31.01.2023 18:17

Пожалуйста, будьте более конкретными. Что именно вы хотите очистить? Является ли это «консольным приложением», как в приложении, которое имеет собственную консоль, или приложение, которое работает в консоли/терминале?

molbdnilo 31.01.2023 18:36

он работает в консоли Windows, и я хочу сделать некоторые вещи после того, как пользователь закроет консоль

Misiu 31.01.2023 18:39
SetConsoleCtrlHandler() это именно то, для чего это нужно... но это дает вам только ограниченное время, прежде чем ваш процесс все равно будет завершен. Немедленно выполните наиболее важные действия по очистке и не позволяйте другим вещам потерпеть неудачу. За исключением обработчика, когда пользователь закрывает консоль в Windows, это, к сожалению, то же самое, что и команда процесса уничтожения.
Dúthomhas 31.01.2023 19:08

о, спасибо, это именно то, что мне было нужно

Misiu 31.01.2023 19:14
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
9
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Есть много способов завершить процесс — закрытие окна консоли — только один из них. В общем, вы не можете полагаться на возможность очистки при закрытии. Альтернативой является очистка в процессе работы и/или очистка остатков при следующем запуске.

Если вас беспокоит только закрытие ситуации с консолью. Вот пара вариантов для Windows. К сожалению, ни один из них не является тривиальным для реализации.

  • Вместо того, чтобы создавать консольное приложение, создайте приложение «Windows», которое не имеет графического интерфейса и вместо этого создает собственную консоль. Когда пользователь закроет эту консоль, процесс все еще будет работать. Я не могу вспомнить, есть ли способ прикрепить вашу программу «Windows» к консоли, с которой она была запущена. Если бы они были, я думаю, что Visual Studio использовала бы это, а не трюк devenv.com и devenv.exe.

  • Создайте консольное приложение, которое запускает вторую (неконсольную) программу. Второй процесс — это ваша основная программа, но он направляет свой вывод в консольное приложение (например, с использованием именованного канала). Точно так же консольное приложение должно будет направлять пользовательский ввод второму процессу. Если пользователь закрывает консоль (или консольное приложение), второй процесс может продолжать работать.

Также загляните в RAII. Используется с умом и все убирается за собой автоматически, за исключением случаев фатальной ошибки. И в случае фатальной ошибки, можете ли вы быть уверены, что система находится в достаточно хорошем состоянии для правильной очистки?

user4581301 31.01.2023 19:29

Другие вопросы по теме