2012-11-15 6 views
0

나는 erl_call에 의해 trigged하는 erlang 서비스를 가지고 있습니다. erl_call은 "gen_server : call (? SERVER, do, infinity)"와 같은 긴 호출을 만들어 결과를 기다립니다. erlang 서비스가 중단되면 erl_call이 리턴됩니다. 그러나 erl_call이 중단되면 (CTRL-C 사용), erlang 서비스는 어떤 메시지도받지 못합니다.erl_call 연결을 끊는 방법

appmon 및 pman으로 확인합니다. erl_call이 시작된 프로세스는 erl_call 연결이 끊어진 후에 죽지 않습니다. 따라서 해당 프로세스에 대한 링크/모니터가 작동하지 않습니다. 이미 연결이 끊긴 erl_call을 어떻게 감지합니까?

답변

0

handle_call 함수에는 두 번째가 있습니다. argument From :: {pid(), tag()}

요청을 처리하기 전에 handle_call에서 monitor (process, FromPid)를 호출하면 erl_call 노드의 연결이 끊어지면 DOWN 메시지가 표시됩니다. 그러나 별도의 프로세스를 생성하거나 지연된 응답을 gen_server : reply()로 사용하지 않는 한 현재 handle_call이 완료되기 전에 DOWN 메시지를 처리 ​​할 수 ​​없습니다.

예를 들어

: 여기에 우리의 handle_call 절입니다 :

handle_call(test, {From, _}=X, State) -> 
    erlang:monitor(process, From), 

    spawn(fun() -> 
     timer:sleep(10000), 
     io:format("### DONE~n", []), 
     gen_server:reply(X, ok) end), 

    {noreply, State}. 

다음으로 우리는 아래로 잡아 : 나는 명령 줄에서 erl_call 산란

handle_info(Info, State) -> 
    io:format("### Process died ~p~n", [Info]), 
    {noreply, State}. 

다음 : erl_call -n 123 -c 테스트 -a ' gen_server call [a, test, infinity] '

히트 Ctrl-C

10 초 후에 gen_server 콘솔에서 보았습니다.

### DONE    
### Process died {'DOWN',#Ref<0.0.0.41>,process,<0.44.0>,normal} 
+0

안녕하세요, 답장을 보내 주셔서 감사합니다. 지연 응답을 사용하고 erl_call을 대기 상태로 유지합니다. 나는 링크/모니터를 사용해보십시오. 그러나 그것은 효과가 없습니다. pman을 사용하면 어떤 프로세스가 결과를 기다리고 있는지 알 수 있습니다. 중단 된 erl_call 이후 프로세스가 여전히 작동하므로 EXIT/DOWN 메시지가 표시되지 않습니다. – shian

+0

음, 지연된 통화가 완료되면 결국 DOWN 메시지가 수신됩니다. 방금 확인했는데 실제로 작동합니다. –

+0

답변을 업데이트했습니다 –