Erlang中进程A链接并监控进程B时,B死亡后的行为疑问
Erlang进程同时关联link与monitor时的终止行为
当进程A通过link关联进程B,同时对B调用monitor(process, B)后,若B终止,进程A的行为分两种情况:
1. A未启用exit捕获(默认状态)
- B终止时,会向A发送exit信号(不属于普通消息队列的消息类型),Erlang默认行为是让A直接跟随B终止,此时monitor触发的
'DOWN'消息根本不会被A处理——因为进程已经终止了。
2. A启用exit捕获(通过process_flag(trap_exit, true)设置)
- 此时B的exit信号会被转化为普通消息,进入A的消息队列;同时monitor触发的
'DOWN'消息也会进入队列。 - 消息顺序:exit消息会先于
'DOWN'消息到达A的消息队列(Erlang内部处理逻辑中,link的exit通知优先级更高)。 - A的反应:A不会自动终止,可以从消息队列中依次取出这两条消息进行自定义处理。
示例代码验证
% 启动进程A并验证消息顺序 A = spawn(fun() -> process_flag(trap_exit, true), % 启动B并关联link B = spawn_link(fun() -> exit(normal) end), % 监控B monitor(process, B), % 接收第一条消息 receive Msg1 -> io:format("First received: ~p~n", [Msg1]) end, % 接收第二条消息 receive Msg2 -> io:format("Second received: ~p~n", [Msg2]) end end).
运行后会输出类似内容:
First received: {'EXIT', <0.123.0>, normal} Second received: {'DOWN', #Ref<0.0.0.456>, process, <0.123.0>, normal}
关键结论
- 默认情况下,A会因link的exit信号直接终止,无法收到任何消息;
- 仅当A启用exit捕获时,才会收到两条消息,且exit消息先于
'DOWN'消息到达,A可自主处理这些消息。
内容的提问来源于stack exchange,提问作者Caker Pang
相关产品推荐
相关产品推荐

