1

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

4

1 回答 1

5

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

有需要考虑的情况:

  • 您以 {active,false} 模式打开服务器 Socket,在这种情况下,服务器会在调用 gen_tcp:recv(Sock, Len) 得到答案 {error, closed} 而不是预期的函数时知道 Socket 已关闭{好的,二进制}。如果您打算使用 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)。

于 2013-03-18T08:44:56.977 回答