【Erlang】gen_server terminate的坑
gen_server进程结束时, 会调用terminate
函数, 但这并不是在任何情况下都成立的.
当gen_server进程主动关闭时, 也就是在回调函数 handle_xxx
中返回 {stop...}
的时候, terminate
是必然被调用的.
当gen_server进程处于监控树中, 被其监控进程关闭时, 情况就不一样了.
只有在这个进程设置了捕获退出信号, 即 process_flag(trap_exit, true)
,
并且其开启选项中设置了关闭超时时间, 而不是 brutal_kill
, terminate
才会被执行.
换句话说, 不捕获退出信号的gen_server被其监控进程关闭时, 会直接死掉,
不执行terminate
函数!
看一下 gen_server
的源代码关于消息处理的部分:
decode_msg(Msg, Parent, Name, State, Mod, Time, Debug, Hib) ->
case Msg of
{system, From, Req …