ACE Reactor завершает работу при прерванном системном вызове - PullRequest
0 голосов
/ 23 января 2011

У меня есть реактор 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.

  1. Безопасно ли снова звонить run_reactor_event_loop?
  2. Что делает метод ACE_Reactor :: restart? Похоже, это должно перезапустить цикл? Поможет ли это?
  3. Насколько безопасно включить SA_RESTART? Это означает, например, что ^ C не остановит мое приложение?
  4. Есть ли другие способы справиться с ситуацией?

1 Ответ

1 голос
/ 26 марта 2011

Проверьте, как построен реактор.ACE_Reactor :: open () cal, принимает параметр «restart» (по умолчанию = false), который говорит ему автоматически перезапускать метод handle_events после прерывания.

...