ソケット接続を受け入れ、それらの接続で着信データをリッスンする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
、理由が「システムコールの中断」であると報告します。どうすれば状況に対処できますか?私が知っていることから、2つのオプションがあります。もう一度呼び出すか、とを使用しrun_reactor_event_loop
て中断された呼び出しを再度呼び出すように構成します。sigaction
SA_RESTART
run_reactor_event_loop
もう一度電話しても大丈夫ですか?- ACE_Reactor :: restartメソッドは何をしますか?ループを再開することになっているように見えますか?それは役に立ちますか?
- 電源を入れるのはどれくらい安全
SA_RESTART
ですか?たとえば、^ Cがアプリケーションを停止しないということですか? - 状況を処理する他の方法はありますか?