Стандартная библиотека C содержит <signal.h>
(например, см. Здесь ), с помощью которого вы можете зарегистрировать обработчик сигнала для SIGINT (Ctrl-C). Это должно сработать, если ваша платформа поддерживает сигналы.
Возможно, вы также захотите зарегистрировать обработчик для SIGTERM, чтобы изящно отвечать на kill (1) ed.
#include <signal.h> // or <csignal> in C++
void ctrlchandler(int) { /*...*/ WE_MUST_STOP = 1; }
void killhandler(int) { /*...*/ WE_MUST_STOP = 2; }
int WE_MUST_STOP = 0;
int main() {
signal(SIGINT, ctrlchandler);
signal(SIGTERM, killhandler);
/* ... */
// e.g. main loop like this:
while(pump_loop() && 0 == WE_MUST_STOP) { }
}
Как предположил Сэм Миллер, предположим, что ваш основной цикл является однопоточным циклом boost.asio с некоторыми значениями m_io_service.run()
. Тогда вместо глобальных флагов вы могли бы (при условии, что m_io_service
виден) post обработчик остановки для службы io из обработчиков сигналов.