سؤال

هل هناك وظائف تسمح لعملية OTP للعثور على PID لمشرفها؟

هل كانت مفيدة؟

المحلول

يتم إخفاء البيانات في قاموس العملية (من أي عملية تولد معها 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,[]}]

هنا الخط الذي يثير اهتمامنا {dictionary,[{'$ancestors',[<0.31.0>]},.

لاحظ أن هذا هو نوع الأشياء التي يجب أن يكون لديك أي سبب لاستخدام نفسك. على حد علمي ، يتم استخدامه في الغالب للتعامل مع الإنهاء النظيف في أشجار الإشراف بدلاً من التأمل لأي رمز لديك. التعامل مع الرعاية.

ستكون هناك طريقة أنظف للقيام بالأشياء دون العبث بأحجار OTP المعقولة اطلب من المشرف أن يمرر PID الخاص به كحجة للعملية عند بدء تشغيله. يجب أن يكون هذا أقل إرباكًا للأشخاص الذين سيقرأون الكود الخاص بك.

نصائح أخرى

إذا كنت تريد أن تفعل ذلك بشكل خاطئ ، فإليك حلنا:

%% @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).
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top