gpt4 book ai didi

sockets - Erlang:进程何时终止以及 gen_tcp:controlling_process(Socket, Pid) 是如何工作的?

转载 作者:行者123 更新时间:2023-12-03 11:56:55 27 4
gpt4 key购买 nike

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

最佳答案

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 关闭,而是始终准备好接受连接。

    最后,总是可以终止一个进程,使用你自己的协议(protocol)来顺利结束,例如 Pid ! {stop,Reason} 或更粗暴的方式使用 exit(Pid, Reason)。

    关于sockets - Erlang:进程何时终止以及 gen_tcp:controlling_process(Socket, Pid) 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15467788/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com