2012-03-19 2 views
2

나는 erlang : monitor/2를 사용하여 gen_server를 모니터하려고했습니다. 불행히도 이것을 시도 할 때마다 Erlang 쉘은 무한 루프에 빠지게됩니다.gen_server 모니터링

다음은 이것을 테스트하기 위해 작성한 테스트 프로그램입니다.

-module(testmon). 

-compile(export_all). 

start() -> 
    {ok,Proc} = gen_server:start(calc,[],[]), 
    erlang:monitor(process,Proc), 
    receive 
     {'DOWN', Ref, process, Pid, normal} -> 
      io:format("~p said that ~p died by natural causes~n",[Ref,Pid]); 
     {'DOWN', Ref, process, Pid, Reason} -> 
      io:format("~p said that ~p died by unnatural causes~n~p",[Ref,Pid,Reason]) 
    end. 

나는이 산란 같은 (재미() -> 확인 끝) 모니터하기 위해 위의 코드를 사용할 때 (행 6을 변경하여 및 7) 얼랑하기 : 모니터 (산란 (재미() -> 확인 끝)) 위의 코드는 의도 한대로 작동합니다.

누군가 내가 잘못하고있는 것을 보여줄 수 있습니까? 감독관을 통해 gen_server 프로세스를 모니터링하는 것만 가능합니까? gen_server 어떤 이유로 죽을 때까지

그것은 무한 루프 (모든 얼랑에는 루프가없는)이 아니다 당신

+0

이 보인다. 또한 끝에 '1000 -> timeout'절을 추가하면 디버그하는 데 도움이 될 수 있습니다. – Lukas

+0

첫 번째 및 두 번째 줄의 시작 기능 ?? 첫 번째 구문 오류입니다. – user425720

+0

수정 됨 : 실수로 붙여 넣을 때 실수로 코드가 엉망입니다. 이것이 내가 원래 의도했던 것입니다. 감사합니다. –

답변

3

감사 에서 쉘 단지 블록을받을 수 있습니다. 쉘을 즉시 반환하려면 모니터링을 수행 할 추가 프로세스가 생성됩니다. gen_supervisor 일 필요는 없으므로 별도의 프로세스 코드가 의도 한대로 작동해야합니다.

은 다음과 같이 보일 수 있습니다 : 당신은 당신의 코드에서 복사 및 붙여 넣기 오류했을처럼

-module(testmon). 

-compile(export_all). 

start() -> 
    {ok,Proc} = gen_server:start(calc,[],[]), 
    spawn(?MODULE, monitor, [Proc]). 

monitor(Proc) -> 
    erlang:monitor(process,Proc), 
    receive 
     {'DOWN', Ref, process, Pid, normal} -> 
      io:format("~p said that ~p died by natural causes~n",[Ref,Pid]); 
     {'DOWN', Ref, process, Pid, Reason} -> 
      io:format("~p said that ~p died by unnatural causes~n~p",[Ref,Pid,Reason]) 
    end. 
+0

그것이 내가 당신의 설명에 감사 드리며 끝낸 이유입니다. –