Нет, а на самом деле то, что вы хотите, невозможно.Сигнал, генерируемый Ctrl + C, является асинхронным , что означает, что он может возникать между любыми двумя машинными инструкциями в вашей программе в зависимости от нажатия Ctrl + C.Таким образом, если ваша программа полностью не избегает вызова асинхронных небезопасных функций где-либо в основном потоке программы, незаконно вызывать асинхронные небезопасные функции из обработчика сигнала.exit
является async-signal-unsafe, как и большинство операций по очистке по умолчанию, которые он выполняет (например, очистка / закрытие открытых файлов).Я ожидаю, что функция atexit
, которую вы хотите зарегистрировать (atexit
, а не on_exit
, правильное имя для этой функции), также захочет делать небезопасные асинхронные сигналы действия.
Если вам нужно выполнить очистку при выходе на основе сигнала, вам нужно установить обработчик сигнала, который не exit
сам по себе, а вместо этого устанавливает глобальный флаг изменчивости, который будет проверяться вашим основным потоком программы (и exit
, если онправда).