You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 18:35:41