收集关于简单的信息
我有一个主管(称为爱丽丝),它开始了一堆工作。 现在我想了解所有这些作品的一些信息。 例如,假设工作人员是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