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、理由が「システムコールの中断」であると報告します。どうすれば状況に対処できますか?私が知っていることから、2つのオプションがあります。もう一度呼び出すか、とを使用しrun_reactor_event_loopて中断された呼び出しを再度呼び出すように構成します。sigactionSA_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 に答える