1. 进程双向监控-Link
-
link方式可以建立进程之间的双向链接关系,当其中一个进程退出时,另一个进程会收到该进程退出的消息。
-
代码
-module(test). -export([start/0]). start() -> Pid = spawn(fun() ->loop() end), Pid2 = spawn(fun() ->loop_link(Pid) end), io:format("Pid ~p~nPid2 ~p~n", [Pid,Pid2]). loop_link(Pid) -> process_flag(trap_exit, true), erlang:link(Pid), receive Msg -> io:format("pid exit: ~p~n", [Msg]) end. loop() -> process_flag(trap_exit, true), receive Msg -> io:format("pid2 exit: ~p~n", [Msg]) end.
-
解除link监控用erlang:unlink(Pid)
2. 进程单向监控-Monitor
-
Monitor方式则实现进程的单向监控,当被监控进程退出时,监控进程会收到该进程退出的消息。
-
代码
-module(test). -export([start/0]). start() -> Pid = spawn(fun() ->loop() end), Pid3 = spawn(fun() ->loop_monitor(Pid) end), io:format("Pid ~p~nPid3 ~p~n", [Pid,Pid3]). loop_monitor(Pid) -> _MonitorRef = erlang:monitor(process, Pid), receive Msg -> io:format("pid exit: ~p~n", [Msg]) end. loop() -> receive Msg -> io:format("pid3 exit: ~p~n", [Msg]) end.
-
解除monitor监控用erlang:demonitor(MonitorRef)