如果Erlang进程proc1
被终止(exit(killed)
)并且另一个进程proc2
被通知此事件,因为它已链接到进程proc1
,是否有可能使用已终止进程{{1}}的邮箱重新生成替换进程?
答案 0 :(得分:3)
不是真的。进程不共享任何数据,因此当一个进程死亡时,没有其他人可以访问它的任何内存。 Erlang不知道等待垃圾收集这样的邮箱需要多长时间。
您可以使用单独的代理流程来模拟,只跟踪邮箱。
或者你可以试着在proc1
中处理更好的事情。您可以使用process_flag(trap_exit, true)
,这样您就可以将exit(killed)
消息作为正常消息{'EXIT',FromPid,killed}
接收。当您收到时,您会读取整个邮箱,然后继续退出所有邮件,这是退出原因的一部分。
看起来有点像这样:
init(Args) ->
process_flag(trap_exit, true),
.... % continiue process innicializaiton.
loop(State) ->
receive
....
{'EXIT', _FromPid, killed} ->
exit({killed, all_messages()})
end.
all_messages() ->
all_messages([]).
all_messages(Messages) ->
receive
AnyMessage ->
all_messages( [AnyMessage|Messages])
after 0 ->
lists:reverse(Messages)
end.
并且proc2
会收到所有未处理的消息,并且可以再次将它们发送到新生成的进程。