Кроссплатформенный код (C++11) для обработки события Ctrl+C в пользовательских функциях. Поддерживаются Windows, Linux и Mac OS X.
Для обработки события/сигнала Ctrl+C следует вызвать функцию:
unsigned int CtrlCLibrary::SetCtrlCHandler(std::function<bool(enum CtrlCLibrary::CtrlSignal)> handler);
где handler - пользовательская функция;
Возвращаемое значение: Возвращается идентификатор добавленного обработчика. В случае ошибки возвращается CtrlCLibrary::kErrorID.
Для удаления обработчика следует вызвать функцию:
void CtrlCLibrary::ResetCtrlCHandler(unsigned int id);
где id - идентификатор обработчика, возвращённый функцией CtrlCLibrary::SetCtrlCHandler.
Скопируйте файлы с кодом (src/ctrl-c.h, src/ctrl-c.cpp) в свой проект.
Файл test/main.cpp показывает использование обработчика Ctrl+C. Скомпилируйте этот код своим любимыми компилятором.
Евгений Кислов - evgenykislov.com, github/evgenykislov
Проект лицензирован под MIT License. Подробнее см. файл LICENSE
Допускается добавлять несколько обработчиков события Cntl+C. Все обработчики будут вызываны в обратном порядке (LIFO): первый добавленный обработчик будет вызван последним. Каждый обработчик должен вернуть значение bool:
- true - остановить обработку и не вызывать последующие обработчики;
- false - продолжить обработку сигнала другими (следующими в очереди) обработчиками (дополнительно, см. примечания для Windows ниже).
Функции установки и сброса обработчика, а также сам обработчик являются потокобезопасными. Внимание: Не следует удалять обработчик события в самом обработчике события - это может вызвать блокироку (deadlock).
Добавление нового обработчика может вернуть ошибку (kErrorID) в случае недостатка памяти или системной ошибки.
Код обрабатывает свои ошибки, а также ошибки выделения памяти в вызове SetCtrlCHandler. В этом случае возвращается идентификатор (kErrorID). Другие исключения не обрабатываются, следует их ловить (и обрабатывать) в своём коде.
Установка любого обработчика приведёт к тому, что предыдущий обработчик перестанет работать. Если первое добавление обработчика возвратит ошибку, то предыдущий обработчик также перестанет работать - ОС будет вызывать обработчик по-умолчанию. Удаление всех обработчиков приведёт к установке обработчика Ctrl+C по-умолчанию.
Если все обработчики вернут false, то будет вызван предыдущий обработчик. Это может быть обработчик самой ОС и в этом случае процесс может быть закрыт.