【问题标题】:Erlang: When does a process terminate and how does gen_tcp:controlling_process(Socket, Pid) work?Erlang:进程何时终止以及 gen_tcp:controlling_process(Socket, Pid) 是如何工作的?
【发布时间】:2013-03-06 06:08:47
【问题描述】:

我想知道的是,如果控制进程是使用gen_tcp:controlling_process(Socket, Pid), 创建的,那么当套接字关闭时,进程Pid 是否会终止,以及套接字在什么条件下会发送此消息{tcp_closed, Socket}?有没有办法防止服务器端的套接字关闭,或者这总是正常的?还有什么特定的方法可以终止知道Pid的进程吗?

【问题讨论】:

    标签: sockets process erlang


    【解决方案1】:

    gen_tcp:controlling_process(Socket, Pid) 用于将 Socket 的控制权交给进程 Pid。当 Socket 关闭时,它不会暗示这个进程的行为。

    有几种情况需要考虑:

    • 您以 {active,false} 模式打开服务器 Socket 在这种情况下,服务器会在调用函数 gen_tcp:recv(Sock, Len) 得到答案 {error,关闭} 而不是预期的 {ok, Binary}。如果您打算使用 gen_tcp:controlling_process(Socket, Pid),我建议您使用此模式,因为它可以让您避免代码中的竞争条件。

    • 你以 {active,true} 或 {active,once} 模式打开服务器 Socket,此时服务器会收到一条消息 {tcp_closed, Socket}。在这种情况下,存在竞争条件,请参阅主题 Erlang: Avoiding race condition with gen_tcp:controlling_process

    我认为服务器的作用不是阻止任何 Socket 关闭,而是始终准备好接受连接。

    最后,总是可以终止进程,使用您自己的协议来顺利结束,例如 Pid ! {stop,Reason} 或更粗暴的方式使用 exit(Pid, Reason)。

    【讨论】:

      猜你喜欢
      • 2015-08-22
      • 2011-02-05
      • 2015-02-08
      • 2011-06-05
      • 2015-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多