spawn_link无法正常工作?

Xia*_*Jia 2 erlang

我正在使用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).
Run Code Online (Sandbox Code Playgroud)

Erlang文档中,原子地在调用进程和新进程之间创建一个链接.但是,我测试如下,并没有注意到链接的影响.

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
Run Code Online (Sandbox Code Playgroud)

在我的理解中,如果链接的一个对等体退出,则另一个对等体退出(或被通知退出).但结果似乎与我的理解不同.

编辑:感谢legosciaPascal的答案.

Pas*_*cal 5

这是因为你选择使用exit(normal).在这种情况下,其他过程不会停止.如果您使用例如,exit(killed)那么您将获得您期望的行为.

您可以使用监视器获取有关正常终止的信息.