2010-11-09 12 views
7

क्या ऐसे कार्य हैं जो ओटीपी प्रक्रिया को अपने पर्यवेक्षक के ढक्कन को खोजने की अनुमति देंगे?ओटीपी प्रक्रिया के पर्यवेक्षक को कैसे ढूंढें?

+1

कोई विचार है, लेकिन पर्यवेक्षक afaik आप लिंक किए गए प्रक्रियाओं हो और कर सकते हैं उनमें से एक है। – ZeissS

उत्तर

12

डेटा प्रविष्टि '$ancestors' के तहत प्रक्रिया शब्दकोश (के किसी भी प्रक्रिया proc_lib साथ पैदा की) में छिपा हुआ है:

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,[]}] 

यहाँ लाइन है कि हितों हमें {dictionary,[{'$ancestors',[<0.31.0>]}, है।

ध्यान दें कि यह ऐसी चीज है जो आपको शायद ही कभी खुद का उपयोग करने का कोई कारण हो। जहां तक ​​मुझे पता है, यह ज्यादातर आपके पास जो भी कोड है, उसके लिए आत्मनिरीक्षण के बजाय पर्यवेक्षण पेड़ में साफ समाप्ति को संभालने के लिए उपयोग किया जाता है। ध्यान से संभालें।

OTP के समझदार धर्मशाला के साथ खिलवाड़ होगा बिना काम करने के लिए एक क्लीनर तरीका है जब यह शुरू करने पर्यवेक्षक की प्रक्रिया के लिए एक तर्क के रूप में अपनी पीआईडी ​​पारित किया है। यह उन लोगों के लिए बहुत कम भ्रमित होना चाहिए जो आपका कोड पढ़ेंगे।

+0

हां, यह एक अच्छा विचार की तरह दिखता है। –

+3

मैं पर्यवेक्षक पिड के पास भी जाऊंगा। इसे लागू करना और बनाए रखना आसान है। –

1

आप इसे गलत क्या करना चाहते हैं, तो यहाँ हमारे समाधान है:

%% @spec get_ancestors(proc()) -> [proc()] 
%% @doc Find the supervisor for a process by introspection of proc_lib 
%% $ancestors (WARNING: relies on an implementation detail of OTP). 
get_ancestors(Pid) when is_pid(Pid) -> 
    case erlang:process_info(Pid, dictionary) of 
     {dictionary, D} -> 
      ancestors_from_dict(D); 
     _ -> 
      [] 
    end; 
get_ancestors(undefined) -> 
    []; 
get_ancestors(Name) when is_atom(Name) -> 
    get_ancestors(whereis(Name)). 

ancestors_from_dict([]) -> 
    []; 
ancestors_from_dict([{'$ancestors', Ancestors} | _Rest]) -> 
    Ancestors; 
ancestors_from_dict([_Head | Rest]) -> 
    ancestors_from_dict(Rest). 
संबंधित मुद्दे