首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >erlang:到controlling_process(),还是不转到controlling_process()

erlang:到controlling_process(),还是不转到controlling_process()
EN

Stack Overflow用户
提问于 2014-03-26 03:11:45
回答 1查看 1.5K关注 0票数 4

考虑一下简单回显服务器的以下erlang代码:

回声听者:

代码语言:javascript
复制
-module(echo_listener).
-export([start_link/1]).

-define(TCP_OPTIONS, [binary, {packet, 0}, {reuseaddr, true},
                        {keepalive, true}, {backlog, 30}, {active, false}]).

start_link(ListenPort) ->
    {ok, ListenSocket} = gen_tcp:listen(ListenPort, ?TCP_OPTIONS),
    accept_loop(ListenSocket).

accept_loop(ListenSocket) ->
    {ok, ClientSocket} = gen_tcp:accept(ListenSocket),
    Pid = spawn(echo_worker, usher, [ClientSocket]),
    gen_tcp:controlling_process(ClientSocket, Pid),
    accept_loop(ListenSocket).

回声工作人员:

代码语言:javascript
复制
-module(echo_worker).
-export([echo/1]).

echo(ClientSocket) ->
    case gen_tcp:recv(ClientSocket, 0) of
        {ok, Data} ->
            gen_tcp:send(ClientSocket, Data),
            echo(ClientSocket);
        {error, closed} ->
            ok
    end.

每当接受客户端套接字时,回送服务器就会生成回显处理程序,并将客户端套接字直接作为函数参数传递。在代码中有controller_process(),但是我尝试了不调用controlling_process()的代码,它也能工作。

controlling_process()的真正目的是什么?什么时候需要?

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-26 06:01:33

Erlang文档介绍了gen_tcp:controlling_process/1:

将一个新的控制过程Pid分配给Socket。控制过程是从套接字接收消息的过程。如果由当前控制进程以外的任何其他进程调用,则返回{error,not_owner}。

您创建了带有选项{active,false}的侦听套接字,并且使用gen_tcp:recv/2同步读取该套接字,这样即使不调用gen_tcp:controlling_process/1,您的代码也能工作。但是,如果您想异步接收数据,则必须创建带有{active,true}选项的侦听套接字。在这种情况下,接受连接的所有者将接收有关传入数据的消息。因此,如果您不调用gen_tcp:controlling_ process /1,这些消息将被发送到侦听器进程,而不是工作者。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22650774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档