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

pan*_*ami 1 sockets erlang process

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

Pas*_*cal 5

gen_tcp:controlling_process(Socket,Pid)用于将Socket的控制权提供给进程Pid.当Socket关闭时,它没有暗示这个过程的行为.

有需要考虑的案例:

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

  • 您在模式打开服务器套接字{活跃,真实}或{活跃,一旦},在这种情况下,服务器将收到一条消息{tcp_closed,插座}.在这种情况下,有一个竞争条件,请参阅主题Erlang:使用gen_tcp避免竞争条件:controlling_process

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

最后,总是可以使用您自己的协议来终止进程,例如Pid!{stop,Reason}或使用exit(Pid,Reason)更残酷的方式.