Erlang:进程何时终止,gen_tcp:controlling_process(Socket,Pid)如何工作?

时间:2013-03-17 23:57:03

标签: sockets process erlang

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

1 个答案:

答案 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)更残酷的方式。