У меня есть реактор ACE, который принимает сокетные соединения и прослушивает входящие данные по этим соединениям. Реактор работает в выделенном потоке. Это функция ввода потока:
int TcpServer::svc()
{
LogDebug("The TCP server on %i is running", mLocalAddr.get_port_number());
// The current thread will own the reactor. By default, a reactor is owned by
// the creating thread. A reactor cannot run from not owning thread.
if (mReactor.owner(ACE_Thread::self()) != 0)
{
LogThrow("Could not change the owner of the reactor");
}
if (mReactor.run_reactor_event_loop() != 0)
{
LogWarning("Reactor loop has quit with an error.");
}
return 0;
}
Время от времени run_reactor_event_loop
завершается с -1, а errno
сообщает, что причиной является "прерванный системный вызов". Как я могу справиться с ситуацией? Из того, что я знаю, у меня есть два варианта: снова набрать run_reactor_event_loop
или настроить повторный вызов на повторный вызов, используя sigaction
и SA_RESTART
.
- Безопасно ли снова звонить
run_reactor_event_loop
?
- Что делает метод ACE_Reactor :: restart? Похоже, это должно перезапустить цикл? Поможет ли это?
- Насколько безопасно включить
SA_RESTART
? Это означает, например, что ^ C не остановит мое приложение?
- Есть ли другие способы справиться с ситуацией?