【发布时间】:2016-02-17 23:19:33
【问题描述】:
我在 elixir 中使用观察者,以下是应用程序的快照 [在应用程序选项卡下]:
一旦它们的工作完成,我需要退出这些进程。不知何故,我无法弄清楚某些过程的起源。有没有办法在 elixir/erlang 中找出创建特定进程的模块/函数?
我们将不胜感激。谢谢。
【问题讨论】:
我在 elixir 中使用观察者,以下是应用程序的快照 [在应用程序选项卡下]:
一旦它们的工作完成,我需要退出这些进程。不知何故,我无法弄清楚某些过程的起源。有没有办法在 elixir/erlang 中找出创建特定进程的模块/函数?
我们将不胜感激。谢谢。
【问题讨论】:
首先,您必须始终拥有进程的 PID 或其引用名称。
Process.info/2
将为您提供有关该流程的信息。您可能会获得更多有关此函数在其调用的 Erlang 函数中如何工作的文档和信息:
还有 arity 1 变体:Process Docs
【讨论】:
[erlang:process_info(Pid, initial_call) || Pid <- erlang:processes()].
但请注意gen_server等,都有相同的初始调用,所以你需要再深入一点。
以下内容改编自https://gist.github.com/rlipscombe/a8e87583d47799170f8b:
lists:map(
fun(Pid) ->
InitialCall = case erlang:process_info(Pid, initial_call) of
{initial_call,{proc_lib,init_p,A}} ->
case erlang:process_info(Pid, dictionary) of
{dictionary, D} ->
proplists:get_value('$initial_call', D, undefined);
_ ->
{proc_lib,init_p,A}
end;
{initial_call,{erlang,apply,A}} ->
case erlang:process_info(Pid, current_function) of
{current_function,MFA} -> MFA;
_ -> {erlang,apply,A}
end;
{initial_call,IC} ->
IC;
Other ->
Other
end,
{Pid, InitialCall}
end, erlang:processes()).
【讨论】:
使用process_info/1,您可以获得进程信息列表,initial_call 和current_function 可以帮助您分别找到生成进程的初始函数调用和进程的当前函数调用。
process_info(Pid, initial_call) 和 process_info(Pid, current_function) 函数也用作快捷方式。
【讨论】: