我有一个 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
and再次调用SA_RESTART
。
- 再打电话安全
run_reactor_event_loop
吗? - ACE_Reactor::restart 方法有什么作用?看起来它应该重新启动循环?会有帮助吗?
- 开机有多安全
SA_RESTART
?例如,这是否意味着 ^C 不会停止我的应用程序? - 有没有其他方法可以处理这种情况?