我想知道的是,如果使用Pid
创建控制进程,套接字关闭时进程gen_tcp:controlling_process(Socket, Pid),
是否会终止,以及套接字在什么条件下发送此消息{{1} }?有没有办法防止服务器端的套接字关闭,或者这总是正常的?知道{tcp_closed, Socket}
是否有任何特定的方法来终止进程?
答案 0 :(得分:5)
gen_tcp:controlling_process(Socket,Pid)用于将Socket的控制权提供给进程Pid。当Socket关闭时,它没有暗示这个过程的行为。
有待考虑的案例:
你以{active,false}模式打开服务器Socket,在这种情况下服务器会在调用函数gen_tcp:recv(Sock,Len)得到答案时知道Socket已关闭{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)更残酷的方式。