收集关于简单的信息

我有一个主管(称为爱丽丝),它开始了一堆工作。 现在我想了解所有这些作品的一些信息。 例如,假设工作人员是TCP服务器,并且我希望获取工作人员使用的所有端口号,或者所有连接到这些工作人员的远程地址。 我应该在哪里放置这个功能?

Supervisor没有gen_server功能,并且无法应答呼叫。 所以,在我看来,最合理的方法是让另一位主管(称为bob)产生主管爱丽丝,另一个gen_server(charile)通过呼叫主管实现如{get,ports_used_by_alices_workers}调用:which_children(alice)然后询问每个爱丽丝的孩子都是港口。 所以,charile是爱丽丝的兄弟姐妹,并回答了关于爱丽丝孩子的电话。 这可以吗? 还是有更好的方法来做到这一点?


您不需要单独的流程来收集这些信息 - 您可以让任何想要港口信息的人自行收集这些信息,方法是通过获取supervisor:which_children/1的子女名单supervisor:which_children/1 ,然后查询每个孩子。 提供这样的API函数,但让该函数在调用者的进程中运行。

或者,你可以去无证(和保修无效)的路线,并在erlang的胆量中徘徊,以获得你想要的信息,而不会与孩子们说话:

[{Child, 
  %% Query linked port for socket information
  [{Link, prim_inet:sockname(Link),
          prim_inet:peername(Link)}
    || %% get list of linked process and ports for process 'Child'
       Link <- element(2, process_info(Child, links)),
       %% filter down to linked ports.
       is_port(Link)] 
  }
 %% Map over all children of the supervisor 'Sup'.
 || Child <- [Pid || {_,Pid,_,_} = supervisor:which_children(Sup)] 
 ]

您可以了解inet:i / 0源代码中的可用信息。

链接地址: http://www.djcxy.com/p/38255.html

上一篇: Collecting info about simple

下一篇: Erlang supervisor and supervisor child