Для Unix:
::signal(SIGINT, sigintHandler);
::signal(SIGKILL, sigkillHandler); //etc
Заставьте эти обработчики помещать событие выхода в очередь событий (или эквивалент) и игнорировать сигнал. Ваше приложение сможет выйти изящно. Однако есть один сигнал (SIGKILL), который нельзя игнорировать. Чтобы справиться с этим, определите наиболее важные ресурсы, которые вы действительно хотите освободить при убийстве (я не уверен, что временный каталог так важен. Просто удалите его при следующем запуске.), И в вашем обработчик, вызовите функцию release
в соответствующих синглетонах.
Для уточнения синглетонов . ::signal
не может вызывать связанные функции, поэтому ваш обработчик имеет доступ только к одиночным / глобальным переменным. Если ваш дизайн не организовывает вещи с помощью синглетонов (и не должен), вы все равно часто можете взломать это. Например, если у вас есть несколько MainWindows в стеке, вы также можете иметь глобальный вектор указателей на все из них, к которому вы можете обращаться из обработчика, если это необходимо.
Обратите внимание, что для обычных убийств (например, с kill foo
) вы получаете SIGQUIT, а не SIGKILL - и SIGQUIT приятно игнорируется. SIGKILL предназначен только для kill -9 foo
(в этом случае пользователь может даже не хочет выполнять очистку).
Да, сигналы волосатые.
edit - Мне сообщили, что SIGKILL не только негоден, но и неуловим . И действительно, на SIGKILL мало что можно сделать вменяемым. Удаление временного каталога? Зачем? Этот временный директор был там по причине.
Просто притворитесь, что sigkill - это сбой питания, и восстановитесь при следующем запуске - если только вы не можете сделать конкретный взлом, как говорили другие по поводу отмены связи.
Это то, что я получаю, говоря из моей задницы.