2011-06-27 64 views
2

我有一個主管(稱爲alice),它啓動了一羣工人。現在我想了解所有這些作品的一些信息。例如,假設工作人員是TCP服務器,並且我希望獲取工作人員使用的所有端口號,或者所有連接到這些工作人員的遠程地址。我應該在哪裏放置這個功能?收集關於simple_one_for_one工人的信息

Supervisor沒有gen_server功能,也無法應答呼叫。所以,在我看來,最合理的方法是讓另一位主管(稱爲bob)產生主管愛麗絲,另一個gen_server(charile)通過呼叫主管實現如{get,ports_used_by_alices_workers}調用:which_children(alice)然後詢問每個愛麗絲的孩子都是港口。所以,charile是愛麗絲的兄弟姐妹,並回答了關於愛麗絲孩子的電話。這可以嗎?還是有更好的方法來做到這一點?

回答

3

你不需要一個單獨的過程來收集這些信息 - 你可以讓任何想要端口信息的人通過獲取supervisor:which_children/1的子女列表來自己收集這些信息,然後查詢每個孩子。提供這樣的API函數,但讓該函數在調用者的進程中運行。

或者,你可以去無證(和質保失效)航線,並在二郎的膽量閒逛得到你想要的信息,但不與子女都:

[{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的信息來源的想法。

+0

謝謝主管:which_children/1正是我所需要的。 – dijxtra

+0

這可能是一個相當糟糕的建議,做一些無證的事情。我會從你的答案中刪除它。 –