为什么在Erlang中加载热代码后,我得不到任何终端输出?

为什么在Erlang中加载热代码后,我得不到任何终端输出?,erlang,Erlang,在试图理解如何使用服务器和热代码加载时,我遇到了一个问题,我将其归结为以下代码: server.erl -module(server). -export([start/0, connect/1]). start() -> {ok, Listen} = gen_tcp:listen(8080, [binary, {packet, raw}, {active, true}]), spawn(?MODULE, connect, [Listen]). connect(Liste

在试图理解如何使用服务器和热代码加载时,我遇到了一个问题,我将其归结为以下代码:

server.erl

-module(server).
-export([start/0, connect/1]).

start() ->
    {ok, Listen} = gen_tcp:listen(8080, [binary, {packet, raw}, {active, true}]),
    spawn(?MODULE, connect, [Listen]).

connect(Listen) ->
    {ok, Socket} = gen_tcp:accept(Listen),
    spawn(?MODULE, connect, [Listen]),
    loop(Socket).

loop(Socket) ->
    receive
        {tcp, Socket, Data} ->
            io:format("1st version received ~p~n", [Data]),
            loop(Socket);
        {tcp_closed, Socket} ->
            io:format("socket closed~n")
    end.
-module(client).
-export([request/0]).

request() ->
    {ok, Socket} = gen_tcp:connect("localhost", 8080, [{packet, raw}, binary]),
    gen_tcp:send(Socket, <<"Hello">>).
客户端.erl

-module(server).
-export([start/0, connect/1]).

start() ->
    {ok, Listen} = gen_tcp:listen(8080, [binary, {packet, raw}, {active, true}]),
    spawn(?MODULE, connect, [Listen]).

connect(Listen) ->
    {ok, Socket} = gen_tcp:accept(Listen),
    spawn(?MODULE, connect, [Listen]),
    loop(Socket).

loop(Socket) ->
    receive
        {tcp, Socket, Data} ->
            io:format("1st version received ~p~n", [Data]),
            loop(Socket);
        {tcp_closed, Socket} ->
            io:format("socket closed~n")
    end.
-module(client).
-export([request/0]).

request() ->
    {ok, Socket} = gen_tcp:connect("localhost", 8080, [{packet, raw}, binary]),
    gen_tcp:send(Socket, <<"Hello">>).
我怀疑这种行为与erlang使用两个以上版本的代码杀死所有进程有关,但我无法真正理解这里发生了什么。 由于这是教育性的,我更感兴趣的是知道为什么这个确切的代码不起作用,而不是问题的实际解决方案


谢谢

我很确定这是两个版本的限制

如果要确认这一点,请将调用从
spawn(…)
替换为
spawn\u link(…)
——如果进程死亡,您的shell也将崩溃,您将知道它们已经死亡

另一种测试方法是,是否可以替换以下内容:

6> c(server).
{ok,server}
7> c(server).
{ok,server}
8> client:request().
ok
作者:


如果这很好,则中间的消息是允许代码更新到完全限定的函数调用(<代码>模块:乐趣(ARGs) >)的新代码版本,防止崩溃。

使用SPAWNSLink显示在两个更新之后被杀死的进程,并且当消息在其间发送时仍然有效。我对哪些进程是相互连接的感到困惑,但现在开始有意义了。
6> c(server).
{ok,server}
7> c(server).
{ok,server}
8> client:request().
ok
6> c(server).
{ok,server}
7> client:request().
ok
8> c(server).
{ok,server}
9> client:request().
ok