Могу ли я при использовании супервизора Erlang выполнить код в ответ на выход дочернего элемента?

Когда ребенок выходит (обычно или при ошибке), я хочу предпринять некоторые действия. Использую ли я erlang:monitor/2? И если да, то как мне получить pid? Кроме того, смогу ли я увидеть, почему он остановился?


person Matt    schedule 01.05.2014    source источник


Ответы (1)


Да, монитор справится.

Вы получите обратно: {'DOWN', MonitorRef, Type, Object, Info}

Где объект - это pid, а информация - причина выхода

Вы также можете использовать link и trap_exit, но ссылки являются двунаправленными, поэтому вы заберете этого ребенка с собой, если родитель умрет.

Самый простой способ получить PID дочернего процесса — это зарегистрировать дочерний процесс в прослушивателе (тот, который использует монитор) при его запуске. Попросите его отправить self(), а затем слушатель сможет отслеживать этот PID.

person David Budworth    schedule 02.05.2014
comment
Итак, как мне передать pid на монитор? - person Matt; 02.05.2014
comment
Если это ваш дочерний процесс, вы, должно быть, создали его, не так ли? Просто следите за этим - person David Budworth; 03.05.2014
comment
Хорошо, извините за путаницу, но я не думаю, что сам завел ребенка. Я вернул дочернюю спецификацию из init(), и библиотека супервизора запустила ее, не так ли? - person Matt; 05.05.2014
comment
Вы говорите о детях какого-то надзирателя, который затеял процесс? Когда вы сказали «ребенок», я подумал, что вы имели в виду, что у вас есть gen_server, который порождает детей. Самый простой способ сделать что-то подобное — использовать gen_server, который вы хотите использовать, в качестве реестра. ребенок запускается и выполняет gen_server:cast(registry_guy,{register_me,self()}). процесс, который будет действовать, должен зарегистрироваться как register_guy, затем в handle_cast вы получите {register_me,Pid} и отслеживаете этот Pid... тогда вы увидите, как они умирают... смысл? - person David Budworth; 06.05.2014
comment
Ха! Это то, что мне нужно. Спасибо. Я отредактировал ответ, чтобы включить это. - person Matt; 06.05.2014