Existe-t-il des fonctions permettant à un processus OTP de trouver le pid de son superviseur?Comment trouver le superviseur d'un processus OTP?
Répondre
Les données sont cachées dans le dictionnaire de processus (de tout processus a donné naissance à proc_lib
) sous l'entrée '$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,[]}]
Voici la ligne qui nous intéresse est {dictionary,[{'$ancestors',[<0.31.0>]},
. Notez que c'est le genre de choses que vous devriez rarement avoir aucune raison de vous utiliser. Pour autant que je sache, il est principalement utilisé pour gérer la terminaison propre dans les arbres de supervision plutôt que l'introspection pour le code que vous avez. Manipuler avec soin.
Une manière plus simple de faire les choses sans se soucier des entrailles sensibles d'OTP serait de que le superviseur passe son propre pid comme argument au processus lors du démarrage. Cela devrait être beaucoup moins déroutant pour les personnes qui liront votre code.
Oui, cela semble être une bonne idée. –
J'irais aussi avec la passe du superviseur pid. C'est plus simple à mettre en œuvre et à maintenir. –
Si vous voulez le faire du mal, voici notre solution:
%% @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).
- 1. erlang OTP Supervisor plantant
- 2. Transmission de signal aux processus gérés à l'aide du superviseur
- 3. comment trouver l'autre processus
- 4. Erlang OTP contrôle de l'application Java
- 5. MVP - Contrôleur Superviseur
- 6. Mode Superviseur/Administrateur
- 7. erlang otp Télécharger
- 8. C#: trouver le processus en cours
- 9. Un processus de gestion client doit-il être ajouté à l'arborescence du superviseur?
- 10. Comment trouver le nom du processus avec l'aide de la poignée de processus en C#
- 11. Comment trouver qui envoie le signal sigterm à mon processus ou à mon groupe de processus?
- 12. SQL Trigger - Maximo WorkOrders - Superviseur/propriétaire Initialisation
- 13. Bibliothèques de journalisation pour Erlang/OTP
- 14. trouver le processus en cours d'exécution dans Android
- 15. Comment puis-je restaurer l'état du processus après un plantage?
- 16. Trouver quel processus accède au registre?
- 17. Impossible de générer un superviseur erlang à partir du shell
- 18. Comment trouver les processus en cours dans VB.NET
- 19. Comment trouver le chemin depuis lequel le processus/exécutable actuel est en cours d'exécution?
- 20. Comment trouver le processus qui consomme le plus d'E/S sous linux?
- 21. Comment trouver quel processus fonctionne Linux à un moment donné?
- 22. Comment trouver une DLL chargée par un processus dans AIX?
- 23. Pour trouver le processus en cours d'exécution dans le gestionnaire de tâches et de tuer le processus
- 24. Comment libérer le processus Excel?
- 25. OTP S/KEY - Comment les graines sont-elles générées, sont-elles aléatoires à chaque fois?
- 26. python et le processus
- 27. Comment trouver le userclick?
- 28. Comment puis-je trouver le nom d'utilisateur d'origine avec lequel un processus a été démarré?
- 29. Comment trouver la quantité totale de mémoire utilisée par le processus/objet python dans Windows
- 30. Comment puis-je trouver le processus Unix qui possède une connexion MySQL locale Sleeping?
Aucune idée, mais autant que je sache, vous pouvez obtenir les processus liés et le superviseur est l'un d'entre eux. – ZeissS