gen_server
正常に停止したり、予期せずクラッシュしたりするたびに、状態をクリーンアップする必要がある実行中です。クリーンアップは、基本的にいくつかのファイルを削除することから成ります。
この時点で、gen_server
クラッシュまたは正常に停止すると、 でクリーンアップが行われterminate/2
ます。
クラッシュterminate/2
した場合に呼び出されない理由はありますか?gen_server
予期せずgen_server
終了した場合、クリーンアップを実行するのを待機している他のプロセスを監視する必要がありますか?gen_server
したがって、コードは次のようになります。
terminate(normal, State) ->
% Invoked when the process stops
% Clean up the mess
terminate(Error, State) ->
% Invoked when the process crashes
% Clean up the mess
編集:公式のメーリングリストで同じことについて話しているこのメールを見つけました:
http://groups.google.com/group/erlang-programming/browse_thread/thread/9a1ba2d974775ce8
Adam が以下で述べているように、exists を にトラップすることを避けたい場合は、gen_server
別のアプローチを使用できます。
しかし、exists をトラップするterminate/2
と、常に呼び出されるため、クリーンアップを行うのに安全な場所と思われます。さらに、'EXIT'
が送信されterminate/2
たときに正しく処理しhandle_call/3
、ワーカーとスーパーバイザーの間でエラーを正しく伝達する必要があります。