2012-03-19 19 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. 

私はこの卵(楽しい() - > OK終了)のようなものを監視するために上記のコードを使用してのerlangに(ライン6と7を変更することによって):監視(産卵(楽しい() - > [OK]を終了し))上記のコードは意図したとおりに動作します。

私が間違っていることを誰かに教えてもらえますか?スーパーバイザを介してgen_serverプロセスを監視することのみが可能ですか?

はgen_serverが、何らかの理由で死ぬまでを受けるで、(アーランにループが全く存在しない)それは無限ループではありません、あなたのシェルだけでブロックを

+0

を、あなたのコード内でのコピー&ペーストのエラーを行っているように思えます。最後に '1000 - > timeout'句を追加すると、デバッグに役立つかもしれません。 – Lukas

+0

開始機能の1行目と2行目?? 1つ目は純粋な構文エラーです。 – 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

それは私があなたの説明のためにあなたに感謝し終わったものです。 –