Прекрасное выключение программы XCode

Я работаю над серверной программой в xcode, и я хочу, чтобы она была изящно закрыта между прогонами отладки. В принципе, следующая строка не работает

std::signal(SIGKILL, [](int){ printf("got sigkill here!\n"); //shut-down code here }); 

Я попытался поймать другие сигналы, но пока SIGINT, SIGTERM и SIGABRT не сработали. Как xcode завершает программу, если она печатает

Программа завершилась кодом выхода: 9

на консоль?

EDIT По-видимому, SIGKILL не может быть пойман, см. Эту запись в википедии.

В отличие от SIGTERM и SIGINT, этот сигнал нельзя поймать или проигнорировать, и процесс приема не может выполнить очистку при получении этого сигнала

Вы не можете поймать SIGKILL . Когда процесс получает SIGKILL , он немедленно завершается. Это используется, чтобы убить багги-процессы, которые не будут реагировать или игнорировать обычный SIGINT . Если вы можете поймать SIGKILL и, возможно, проигнорировать его, тогда не будет возможности убить багги-процесс, кроме перезагрузки машины.

Также обратите внимание, что вы вызываете printf() в обработчике сигналов, что недопустимо. Вы не можете ожидать, что это сработает.

Вы можете взглянуть на безопасные по signal функции на странице управления signal : http://man7.org/linux/man-pages/man7/signal.7.htmlprintf не является частью этого, поэтому все ставки отключены.

С manpage:

Функция обработчика сигнала должна быть очень осторожной, так как обработка в другом месте может быть прервана в какой-то произвольной точке выполнения программы. POSIX имеет понятие «безопасная функция». Если сигнал прерывает выполнение небезопасной функции, а обработчик вызывает небезопасную функцию, то поведение программы не определено.

См. Этот вопрос для безопасных альтернатив: печать int из обработчика сигнала с помощью функций записи или асинхронного использования