Когда ребенок выходит (обычно или при ошибке), я хочу предпринять некоторые действия. Использую ли я erlang:monitor/2? И если да, то как мне получить pid? Кроме того, смогу ли я увидеть, почему он остановился?
Могу ли я при использовании супервизора Erlang выполнить код в ответ на выход дочернего элемента?
Ответы (1)
Да, монитор справится.
Вы получите обратно: {'DOWN', MonitorRef, Type, Object, Info}
Где объект - это pid, а информация - причина выхода
Вы также можете использовать link и trap_exit, но ссылки являются двунаправленными, поэтому вы заберете этого ребенка с собой, если родитель умрет.
Самый простой способ получить PID дочернего процесса — это зарегистрировать дочерний процесс в прослушивателе (тот, который использует монитор) при его запуске. Попросите его отправить self(), а затем слушатель сможет отслеживать этот PID.
person
David Budworth
schedule
02.05.2014
Итак, как мне передать pid на монитор?
- person Matt; 02.05.2014
Если это ваш дочерний процесс, вы, должно быть, создали его, не так ли? Просто следите за этим
- person David Budworth; 03.05.2014
Хорошо, извините за путаницу, но я не думаю, что сам завел ребенка. Я вернул дочернюю спецификацию из init(), и библиотека супервизора запустила ее, не так ли?
- person Matt; 05.05.2014
Вы говорите о детях какого-то надзирателя, который затеял процесс? Когда вы сказали «ребенок», я подумал, что вы имели в виду, что у вас есть 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
Ха! Это то, что мне нужно. Спасибо. Я отредактировал ответ, чтобы включить это.
- person Matt; 06.05.2014