Erlang 产卵链接不工作?

Erlang 产卵链接不工作?,erlang,Erlang,我正在使用spawn\u 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\u 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).
从中,在调用进程和新进程之间创建一个原子链接。然而,我测试如下,没有注意到链接的效果

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
1>测试:尝试\u spawn\u link()。
起源:
儿童:
2> 进程是否活动(pid(0,34,0))。
真的
3> 进程是否活动(pid(0,35,0))。
真的
4> pid(0,35,0)!退出
退出
5> 进程是否活动(pid(0,35,0))。
假的
6> 进程是否活动(pid(0,34,0))。
真的
1> 测试:尝试生成链接()。
起源:
儿童:
2> 进程是否活动(pid(0,34,0))。
真的
3> 进程是否活动(pid(0,35,0))。
真的
4> pid(0,34,0)!退出
退出
5> 进程是否活动(pid(0,35,0))。
真的
6> 进程是否活动(pid(0,34,0))。
假的
据我所知,如果链路的一个对等方退出,其他对等方退出(或被通知退出)。但结果似乎与我的理解不同

编辑:感谢和的回答


这是因为您选择了使用
exit(normal)
。在这种情况下,另一个进程不会停止。如果使用例如
exit(killed)
,则将获得预期的行为


您可以使用监视器获得有关正常终止的通知。

如的“错误处理”部分所述,链接进程退出仅当退出原因不是
正常时才会导致其链接进程退出。这就是OTP广泛使用停机原因的原因。

接受这一点作为您详细解释的答案。