【发布时间】:2013-03-06 06:08:47
【问题描述】:
我想知道的是,如果控制进程是使用gen_tcp:controlling_process(Socket, Pid), 创建的,那么当套接字关闭时,进程Pid 是否会终止,以及套接字在什么条件下会发送此消息{tcp_closed, Socket}?有没有办法防止服务器端的套接字关闭,或者这总是正常的?还有什么特定的方法可以终止知道Pid的进程吗?
【问题讨论】:
我想知道的是,如果控制进程是使用gen_tcp:controlling_process(Socket, Pid), 创建的,那么当套接字关闭时,进程Pid 是否会终止,以及套接字在什么条件下会发送此消息{tcp_closed, Socket}?有没有办法防止服务器端的套接字关闭,或者这总是正常的?还有什么特定的方法可以终止知道Pid的进程吗?
【问题讨论】:
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)。
【讨论】: