我有一个关于受监控/链接进程死亡时间的问题,我想不出如何在实践中对其进行测试。这是我担心的情况。

假设我有一个名为 masterslave 的进程。

  • mastertrap_exit 设置为 true
  • master 执行 {ok, Pid} = slave:start_link() 从而将两者联系起来。
  • master 相当于 gen_server:call(Pid, Msg)
  • 在消息到达进程崩溃的 Pid 之前。

  • 问题:
  • master 会先收到 EXIT 消息吗?或
  • 由于 master 已死,{noproc,{gen_server.. 会因 Pid 异常而失败吗?
  • 最佳答案

    不是经过验证的答案,但这是可能发生的情况。

    首先我们应该明白的是 EXIT 是一条正在发送到 master 邮箱的消息。与 noproc 错误相反,master 错误是在 EXIT 进程上下文(不是消息)中生成的错误。
    这意味着您可能会同时获得两者。问题是谁先来。

    由于 call 消息是立即发送的,并且由于您说进程在 EXIT 到达之前崩溃,因此您将首先获得 EXIT 消息是有道理的。但是,由于它们是独立的,因此有一个选项,即在 master 消息到达 gen_server:call 邮箱之前,您的 noproc 将返回 ojit_code 错误。

    如果您出于实现目的要求这样做,我建议涵盖这两种情况。我真的不认为 Erlang 会 promise 哪个会是第一个。

    关于erlang - 当被监控的进程在 handle_call 完成之前死亡会发生什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38885676/

    10-17 01:25