0

gen_server が停止しているときにコードを実行したいと考えています。gen_server トラップ出口があります ( process_flag(trap_exit, true)init コールバックに追加しました)。terminate/2これは、プロセスが終了する前に常に呼び出されるため、うまく機能します。リンクされたプロセスの終了をトラップしているため、クラッシュしても、作成した gen_server はクラッシュしないことがわかっています。私はこれを回避することができますが、process_flag(trap_exit, true)これを達成するために使用する代替手段があるかどうか疑問に思っていますか?

「プロセスが終了する前」のコールバックが必要です。この出口のようなものは他にありますか?

4

2 に答える 2

3

フロントドキュメント:

trap_exit が true に設定されている場合、プロセスに到着した終了シグナルは {'EXIT', From, Reason} メッセージに変換され、通常のメッセージとして受信できます。trap_exit が false に設定されている場合、プロセスは通常以外の終了シグナルを受信すると終了し、終了シグナルはリンクされたプロセスに伝搬されます。通常、アプリケーション プロセスは終了をトラップしません。

これは、リンクされたプロセスのいずれかが異常終了した場合に、trap_exit フラグが true に設定されているプロセスが終了しないことを意味します。フォームのメッセージをキャッチする句を含む受信ブロックが必要 {'EXIT', From, Reason}です。この receive 句では、最終的にプロセスを停止する前に必要なことを行うことができます。

gen_server では、 callback を記述する必要がありますModule:handle_info({'EXIT', From, Reason}, State) -> Result

于 2014-10-10T22:14:23.153 に答える