|
| 1 | +# Ctrl+C |
| 2 | + |
| 3 | +Кроссплатформенный код (C++11) для обработки события Ctrl+C в пользовательских функциях. |
| 4 | +Поддерживаются Windows, Linux и Mac OS X. |
| 5 | + |
| 6 | +## Использование |
| 7 | + |
| 8 | +Для обработки события/сигнала Ctrl+C следует вызвать функцию: |
| 9 | +```cpp |
| 10 | +unsigned int CtrlCLibrary::SetCtrlCHandler(std::function<bool(enum CtrlCLibrary::CtrlSignal)> handler); |
| 11 | +``` |
| 12 | +где handler - пользовательская функция; |
| 13 | +
|
| 14 | +**Возвращаемое значение**: |
| 15 | +Возвращается идентификатор добавленного обработчика. В случае ошибки возвращается CtrlCLibrary::kErrorID. |
| 16 | +
|
| 17 | +Для удаления обработчика следует вызвать функцию: |
| 18 | +```cpp |
| 19 | +void CtrlCLibrary::ResetCtrlCHandler(unsigned int id); |
| 20 | +``` |
| 21 | +где id - идентификатор обработчика, возвращённый функцией CtrlCLibrary::SetCtrlCHandler. |
| 22 | + |
| 23 | +### Установка |
| 24 | + |
| 25 | +Скопируйте файлы с кодом (src/ctrl-c.h, src/ctrl-c.cpp) в свой проект. |
| 26 | + |
| 27 | +## Пример использования |
| 28 | + |
| 29 | +Файл test/main.cpp показывает использование обработчика Ctrl+C. |
| 30 | +Скомпилируйте этот код своим любимыми компилятором. |
| 31 | + |
| 32 | +## Автор |
| 33 | + |
| 34 | +**Евгений Кислов** - [evgenykislov.com](https://evgenykislov.com), [github/evgenykislov](https://github.com/evgenykislov) |
| 35 | + |
| 36 | +## Лицензия |
| 37 | + |
| 38 | +Проект лицензирован под MIT License. Подробнее см. файл [LICENSE](LICENSE) |
| 39 | + |
| 40 | +## Примечания |
| 41 | + |
| 42 | +Допускается добавлять несколько обработчиков события Cntl+C. Все обработчики будут вызываны в обратном порядке (LIFO): первый добавленный обработчик будет вызван последним. |
| 43 | +Каждый обработчик должен вернуть значение bool: |
| 44 | +* *true* - остановить обработку и не вызывать последующие обработчики; |
| 45 | +* *false* - продолжить обработку сигнала другими (следующими в очереди) обработчиками (дополнительно, см. примечания для Windows ниже). |
| 46 | + |
| 47 | +Функции установки и сброса обработчика, а также сам обработчик являются потокобезопасными. *Внимание*: Не следует удалять обработчик события в самом обработчике события - это может вызвать блокироку (deadlock). |
| 48 | + |
| 49 | +#### Ошибки |
| 50 | +Добавление нового обработчика может вернуть ошибку (kErrorID) в случае недостатка памяти или системной ошибки. |
| 51 | + |
| 52 | +#### Исключения |
| 53 | +Код обрабатывает свои ошибки, а также ошибки выделения памяти в вызове SetCtrlCHandler. В этом случае возвращается идентификатор (kErrorID). |
| 54 | +Другие исключения не обрабатываются, следует их ловить (и обрабатывать) в своём коде. |
| 55 | + |
| 56 | +#### Примечания для Linux и Mac OS X |
| 57 | +Установка любого обработчика приведёт к тому, что предыдущий обработчик перестанет работать. Если первое добавление обработчика возвратит ошибку, то предыдущий обработчик также перестанет работать - ОС будет вызывать обработчик по-умолчанию. |
| 58 | +Удаление всех обработчиков приведёт к установке обработчика Ctrl+C по-умолчанию. |
| 59 | + |
| 60 | +#### Примечания для Windows |
| 61 | +Если все обработчики вернут **false**, то будет вызван предыдущий обработчик. Это может быть обработчик самой ОС и в этом случае процесс может быть закрыт. |
0 commit comments