2011-01-23 5 views
0

나는 소켓 연결을 받아들이고 그 연결에서 들어오는 데이터를 수신하는 ACE 리액터가 있습니다. 반응기는 전용 실에서 작동합니다. 이유는 "중단 된 시스템 호출"이라고 -1 errno 보고서를 잠시 run_reactor_event_loop 종료에 한 번ACE Reactor가 중단 된 시스템 호출에서 종료

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을 다시 호출하거나 sigactionSA_RESTART을 사용하여 중단 된 호출을 다시 호출하도록 구성하십시오.

  1. run_reactor_event_loop으로 다시 전화해도 안전합니까?
  2. ACE_Reactor :: restart 메서드의 기능은 무엇입니까? 루프를 다시 시작해야하는 것 같습니다. 도움이 될까요?
  3. 켜는 것이 얼마나 안전합니까? SA_RESTART? 예를 들어,^C가 내 응용 프로그램을 중단시키지 않는다는 것을 의미합니까?
  4. 상황을 처리하는 다른 방법이 있습니까?
+0

소스 코드를 살펴 보았습니까? –

+0

@Peter G., 그랬습니다. ACE_Reactor :: handle_events()가 -1을 반환하면 -1을 반환합니다. 코드가 복잡해 지긴하지만 더 깊이 파헤 치려고합니다. – FireAphis

+0

디버깅을 했습니까? – DumbCoder

답변

1

반응기가 어떻게 구성되어 있는지 확인하십시오. ACE_Reactor :: open() cal, 중단 후 자동으로 handle_events 메서드를 다시 시작하도록 지시하는 "restart"매개 변수 (기본값 = false)를 사용합니다.

관련 문제