Как вы определяете PID родителя процесса

У меня есть процесс в Erlang, который должен сделать что-то сразу после появления, затем отправить результат родителю, когда он будет завершен. Как мне определить PID процесса, который его породил?

7.08.2008 01:54:12
Сведения об использовании OTP и других процессов proc_libсм. В разделе Как найти супервизор процесса OTP?
Ilia K. 19.05.2011 11:30:16
4 ОТВЕТА
РЕШЕНИЕ

Вы должны передать self () дочернему элементу в качестве одного из аргументов функции входа.

spawn_link(?MODULE, child, [self()]).
15
7.08.2008 02:27:32

Вы можете использовать регистр BIF, чтобы дать процессу / родительскому процессу имя (атом), а затем сослаться на зарегистрированное имя из других процессов.

FUNC () ->

%% Сделай что-нибудь
%% Тогда отправь сообщение родительскому
родителю! СООБЩЕНИЕ.

...

регистр (parent, self ()),
spawn (MODULE, FUNC, [ARGS]).

См. Начало работы с Erlang §3.3 и Справочное руководство Erlang §10.3 .

0
7.08.2008 04:04:28
Хотя вы можете сделать это, зарегистрировав имя, это совсем не хорошая идея. Этот пост был бы лучше, если бы вы активно отговаривали от этого и объясняли проблемы.
Christian 13.08.2009 11:35:43
В частной бета-версии (этот вопрос датируется примерно через неделю после начала частной беты), аспект обсуждения на сайте был не очень хорошо сформирован. Я действительно не хотел высказывать свое мнение, просто высказывал альтернативный подход. Я думаю, что плюсы и минусы были адекватно рассмотрены в других ответах / сообщениях.
Greg Case 20.08.2009 03:18:34

Ответ @Eridius является предпочтительным способом сделать это. Требование процесса для регистрации имени может иметь непредвиденные побочные эффекты, такие как увеличение наглядности процесса, не говоря уже о том, что приходится сталкиваться с уникальными именами, когда у вас много процессов.

4
16.09.2008 14:35:32

Лучший способ - это передать его в качестве аргумента функции, вызываемой для запуска дочернего процесса. Если вы порождаете веселье, что обычно хорошо, будьте осторожны:

spawn_link(fun () -> child(self()) end)

который не будет делать, как вы хотели. (Подсказка: когда вызывается self ())

Как правило, вам следует избегать регистрации процесса, то есть давать ему глобальное имя, если вы действительно не хотите, чтобы он был известен всему миру. Создание веселья означает, что вам не нужно экспортировать порожденную функцию, так как вы должны избегать экспорта функций, которые не должны вызываться из других модулей.

4
11.08.2009 16:19:38