0

我有一个 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再次调用或将中断的调用配置为使用sigactionand再次调用SA_RESTART

  1. 再打电话安全run_reactor_event_loop吗?
  2. ACE_Reactor::restart 方法有什么作用?看起来它应该重新启动循环?会有帮助吗?
  3. 开机有多安全SA_RESTART?例如,这是否意味着 ^C 不会停止我的应用程序?
  4. 有没有其他方法可以处理这种情况?
4

1 回答 1

1

检查 Reactor 是如何构建的。ACE_Reactor::open() cal,采用“restart”参数(默认 = false)告诉它在中断后自动重新启动 handle_events 方法。

于 2011-03-26T19:00:01.700 回答