so_4: Версия 4.4.0. Обработка сигналов SIGINT, SIGTERM, SIGHUP и SIGPIPE
До версии 4.4.0-beta6 SObjectizer никак не реагировал на сигналы SIGINT, SIGTERM, SIGHUP и SIGPIPE. Например, если пользователь прерывал работу какого-либо тестового консольного приложения SObjectizer через Ctrl+C, то использовались штатные обработчики сигнала SIGINT, которые аварийно завершали работу приложения. В версии 4.4.0-beta6 подобное завершение не всегда останавливало работу приложения: например, под Windows в приложении оставались работоспособными нити реакторов и таймеров и приложение не завершалось.
Для преодоления этой ситуации в SObjectizer 4.4.0-beta6 при старте SObjectizer Run-Time запускается отдельная нить (называемая signal_thread), которая:
- устанавливает обработчик сигналов SIGINT, SIGTERM, SIGHUP и SIGPIPE;
- входит в бесконечный цикл ожидания одного из двух событий: возникновение одного из сигналов (SIGINT, SIGTERM, SIGHUP) или нормального завершения работы SObjectizer Run-Time. Проверка этих условий выполняется через каждые 100 миллисекунд (все остальное время нить находится внутри ACE_OS::sleep());
- если срабатывает один из сигналов (SIGINT, SIGTERM, SIGHUP), то работа SObjectizer завершается посредством so_4::api::shutdown();
- сигнал SIGPIPE игнорируется;
- после завершения ожидания одного из событий восстанавливает оригинальные обработчики сигналов SIGINT, SIGTERM и SIGHUP.
Т.е. по умолчанию SObjectizer 4.4.0-beta6 выполняет самую простую обработку сигналов SIGINT и пр. Если приложение это не устраивает, то приложение должно реализовать свою обработку сигналов и запретить SObjectizer-у запуск signal_thread.
Если приложение использует какую-либо свою схему обработки сигналов (например, предоставляемую GUI библиотекой), то приложение должно запретить SObjectizer-у запуск signal_thread.
Запрещение запуска signal_thread выполняется с помощью API-функции so_4::api::sobjectizer_settings():
- Внимание:
- Вызов so_4::api::sobjectizer_settings() нужно выполнять перед стартом SObjectizer Run-Time. Все изменения в настройках SObjectizer, сделанные уже во время работы SObjectizer Run-Time будут учтены только при следующем обращении к so_4::api::start().