Я работаю над серверной программой в 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.html – printf
не является частью этого, поэтому все ставки отключены.
С manpage:
Функция обработчика сигнала должна быть очень осторожной, так как обработка в другом месте может быть прервана в какой-то произвольной точке выполнения программы. POSIX имеет понятие «безопасная функция». Если сигнал прерывает выполнение небезопасной функции, а обработчик вызывает небезопасную функцию, то поведение программы не определено.
См. Этот вопрос для безопасных альтернатив: печать int из обработчика сигнала с помощью функций записи или асинхронного использования