如何找到OTP流程的主管?

Ale*_*nov 7 erlang erlang-otp erlang-supervisor

是否有允许OTP进程找到其主管的pid的功能?

I G*_*ICE 13

数据隐藏在proc_lib条目下的进程字典(生成的任何进程)中'$ancestors':

1> proc_lib:spawn(fun() -> timer:sleep(infinity) end).
<0.33.0>
2> i(0,33,0).
[{current_function,{timer,sleep,1}},
 {initial_call,{proc_lib,init_p,3}},
 {status,waiting},
 {message_queue_len,0},
 {messages,[]},
 {links,[]},
 {dictionary,[{'$ancestors',[<0.31.0>]},
              {'$initial_call',{erl_eval,'-expr/5-fun-1-',0}}]},
 {trap_exit,false},
 {error_handler,error_handler},
 {priority,normal},
 {group_leader,<0.24.0>},
 {total_heap_size,233},
 {heap_size,233},
 {stack_size,6},
 {reductions,62},
 {garbage_collection,[{min_bin_vheap_size,46368},
                      {min_heap_size,233},
                      {fullsweep_after,65535},
                      {minor_gcs,0}]},
 {suspending,[]}]
Run Code Online (Sandbox Code Playgroud)

这里我们感兴趣的是{dictionary,[{'$ancestors',[<0.31.0>]},.

请注意,这是您应该很少有任何理由自己使用的东西.据我所知,它主要用于处理监督树中的干净终止,而不是对你拥有的任何代码进行内省.小心轻放.

一个更干净的方式做事情而不会弄乱OTP的明智内脏就是让主管在启动它时将自己的pid作为参数传递给它.对于那些阅读代码的人来说,这应该不那么令人困惑.

  • 我也会跟上主管pid的通行证一样.它的实现和维护更简单. (3认同)