我对显示器有疑问。
1> Pid=spawn(fun() -> timer:sleep(500000) end).
2> exit(Pid, kill).
3> Ref=erlang:monitor(process, Pid).
4> flush().
我的shell中flush()的输出是{'DOWN',#Ref<0.0.0.159>,process,<0.69.0>,noproc}
我的问题是:如果进程在创建监视器之前被杀死,那么外壳程序是如何收到'DOWN'
消息的?
此功能可避免出现竞争状况。请记住,就目前所知,所有其他进程可能随时消失。因此,它可能会在调用erlang:monitor
之前或之后死掉,并且必须为每台监视器同时考虑这两种情况是非常麻烦的。
这就是为什么监视无效进程会提供与被监视进程死亡时所获得的消息具有相同形式的消息。唯一的区别是退出原因始终为noproc
。
您收到一条消息,提示没有进程。这是有道理的,因为当您开始监视一个进程时,它可能已经死亡。如果您执行相反操作,则消息会有所不同:
1> Pid=spawn(fun() -> timer:sleep(500000) end).
<0.35.0>
2> exit(Pid, kill).
true
3> Ref=erlang:monitor(process, Pid).
#Ref<0.0.0.38>
4> flush().
Shell got {'DOWN',#Ref<0.0.0.38>,process,<0.35.0>,noproc}
ok
5>
5> Pid1=spawn(fun() -> timer:sleep(500000) end).
<0.40.0>
6> Ref1=erlang:monitor(process, Pid1).
#Ref<0.0.0.53>
7> exit(Pid1, kill).
true
8> flush().
Shell got {'DOWN',#Ref<0.0.0.53>,process,<0.40.0>,killed}
ok
9>
如果Pid2因退出原因而终止,则会发送“ DOWN”消息到Pid1:
{'DOWN', Ref, process, Pid2, Reason}
如果Pid2不存在,则会立即发送'DOWN'消息,并带有原因设置为noproc。