【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 …