erlang:monitor/2
开启一个监控过程
用法:
monitor(Type, Item) -> MonitorRef
对被调用的进程开启一个监控过程,参数 Type 是被监控对象 Item 的类型。
当前只有进程可以被监视,Type 的取值只允许是 process,但其他类型也许以后会被允许。
Item 可以是:
- pid():一个进程标识符是 pid 的进程被监控
- {RegName, Node}:用元组包含着一个进程的注册名和一个节点名。驻留在节点 Node 的注册名为 RegName 的进程将被监控
- RegName:本地节点上注册名为 RegName 的进程将被注册
如果被监控的对象 Item 死亡,或者是不存在,或者是对象 Item 所在的节点失去了连接,那么一个 'DOWN' 的信息将会发送到被监控的进程上。一个 'DOWN' 消息的格式如下:
{'DOWN', MonitorRef, Type, Object, Info}
MonitorRef 是该监控过程的一个引用,Type 是指上面所说的对象类型,
Object 是监控对象的一个引用。如果 Item 指定为 pid,那么 Object 是被监控进程的 pid。如果 Item 指定为 {RegName, Node},那么 Object 则是 {RegName, Node}。如果 Item 指定为 RegName,那么 Object 则是 {RegName, Node}(这里的 Node 是指本地节点 node())。
当接收到一条 'DOWN' 消息,或调用了 erlang:demonitor/1 函数,监控过程将被停止。
可以对同一个对象 Item 开启多个监控过程,他们只负责各自的监控事务,并不会报错。
erlang:monitor(process, self()).
spawn(fun()-> erlang:monitor(process,Proc), receive {'DOWN', Ref, process, Pid, normal} -> io:format("~p said that ~p died by natural causes~n",[Ref,Pid]); {'DOWN', Ref, process, Pid, Reason} -> io:format("~p said that ~p died by unnatural causes~n~p",[Ref,Pid,Reason]) end end).