我正在使用spawn_link
,但不了解其行为。请考虑以下代码:
-module(test).
-export([try_spawn_link/0]).
try_spawn_link() ->
spawn(fun() ->
io:format("parent: ~p~n", [Parent = self()]),
Client = spawn_link(fun() ->
io:format("child: ~p~n", [self()]),
spawn_link_loop(Parent)
end),
spawn_link_loop(Client)
end).
spawn_link_loop(Peer) ->
receive
quit ->
exit(normal);
Any ->
io:format("~p receives ~p~n", [self(), Any])
end,
spawn_link_loop(Peer).
从the Erlang documentation开始,原子地在调用进程和新进程之间创建一个链接。但是,我测试如下,并没有注意到链接的影响。
1> test:try_spawn_link().
parent: <0.34.0>
<0.34.0>
child: <0.35.0>
2> is_process_alive(pid(0,34,0)).
true
3> is_process_alive(pid(0,35,0)).
true
4> pid(0,35,0) ! quit.
quit
5> is_process_alive(pid(0,35,0)).
false
6> is_process_alive(pid(0,34,0)).
true
1> test:try_spawn_link().
parent: <0.34.0>
<0.34.0>
child: <0.35.0>
2> is_process_alive(pid(0,34,0)).
true
3> is_process_alive(pid(0,35,0)).
true
4> pid(0,34,0) ! quit.
quit
5> is_process_alive(pid(0,35,0)).
true
6> is_process_alive(pid(0,34,0)).
false
根据我的理解,如果链接的一个对等体退出,则另一个对等体退出(或被通知退出)。但结果似乎与我的理解不同。
答案 0 :(得分:5)
这是因为您选择使用exit(normal)
。在这种情况下,其他过程不会停止。如果您使用例如exit(killed)
,那么您将获得您期望的行为。
您可以使用显示器获取有关正常终止的信息。
答案 1 :(得分:4)
如Processes chapter of the Erlang reference manual的“错误处理”部分所述,只有当退出原因不是normal
时,退出的链接进程才会导致其链接进程退出。这就是为什么OTP广泛使用shutdown
退出原因。