Во всех операционных системах вы всегда можете внезапно завершить любую программу.Подумайте о команде kill -9
в Unix / Linux.Вы делаете это в любой программе, и она мгновенно останавливается.Нет способа поймать его в ловушку.У программы нет возможности запросить еще несколько циклов операционной системы для очистки.
Я не в курсе разницы между сигналами Unix и Windows, но вы можете представить, почему каждая ОС должна разрешать то, что мы называемв Unix SIGKILL - верный и немедленный способ уничтожения любой программы.
Представьте, что у вас есть программа с ошибками, которая перехватывает запрос на завершение (SIGTERM в Unix) и вводит очисткуфаза.Вместо очистки программа застревает в цикле, который запрашивает все больше и больше памяти.Если бы вы не смогли вытащить аварийный шнур SIGKILL , вы застряли бы.
Окончательный SIGKILL , конечно, это вилка в стене.Потяните его, и программа (вместе со всем остальным) замирает.Ваша программа никак не может сказать: " Хм ... питание отключено, и машины перестали работать ... Лучше запустите старую процедуру очистки! "
Так что неттаким образом, вы можете перехватывать каждый сигнал завершения программы, и ваша программа должна будет учитывать это.Что вы можете сделать, это посмотреть, нужно ли вашей программе выполнить очистку перед запуском.В Windows вы можете поместить запись в реестр при запуске программы и удалить ее, когда она выключается и выполняет очистку.В Unix вы можете поместить имя файла или каталога, начиная с точки, в каталог $ENV{HOME}
.
Еще в 1980-х годах я писал бухгалтерское программное обеспечение для очень проприетарной ОС.Когда пользователь нажал кнопку ESCAPE, мы должны были немедленно вернуться в главное меню.Если пользователь вводил заказ и брал вещи из инвентаря, транзакция была бы незавершенной, и инвентарь показывал бы товары как продано , даже если заказ был неполным.Решение состояло в том, чтобы проверить эти незавершенные заказы в следующий раз, когда кто-то ввел заказ, и откатить изменения в инвентаре до ввода нового заказа.Ваша программа может делать что-то подобное.