Вам не нужен отдельный процесс для сбора этой информации - вы можете просто позволить тому, кто хочет, чтобы информация о порте собирала ее самостоятельно, получая список детей с 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 .