轉載:http://www.cnblogs.com/me-sa/archive/2011/11/20/erlang0016.html
link方式可以建立進程之間的雙向連結關係,我們可以通過monitor實現單向的監控,這在gen_server代碼裡面可以看到對應的例子
- erlang:monitor(process, Caller),
%建立單向監控
- 被監控進程死掉發送的訊息規格: {'DOWN',Mref,process,Pid,Reason}
- 解除監控:erlang:demonitor(Ref)
gen_server程式碼片段:
do_multi_call(Nodes, Name, Req, Timeout) ->
Tag = make_ref(),
Caller = self(),
Receiver =
spawn(
fun() ->
%% Middleman process. Should be unsensitive to regular
%% exit signals. The sychronization is needed in case
%% the receiver would exit before the caller started
%% the monitor.
process_flag(trap_exit, true),
Mref = erlang:monitor(process, Caller),
%建立單向監控
receive
{Caller,Tag} ->
Monitors = send_nodes(Nodes, Name, Tag, Req),
TimerId = erlang:start_timer(Timeout, self(), ok),
Result = rec_nodes(Tag, Monitors, Name, TimerId),
exit({self(),Tag,Result});
{'DOWN',Mref,_,_,_} -> %接受監控訊息
%% Caller died before sending us the go-ahead.
%% Give up silently.
exit(normal)
end
end),
Mref = erlang:monitor(process, Receiver),
Receiver ! {self(),Tag},
receive
{'DOWN',Mref,_,_,{Receiver,Tag,Result}} ->
Result;
{'DOWN',Mref,_,_,Reason} ->
%% The middleman code failed. Or someone did
%% exit(_, kill) on the middleman process => Reason==killed
exit(Reason)
end.