Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

spawn_link(?MODULE, child, [self()]).

Ответ 2

Ответ

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

Ответ 3

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

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

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

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

Ответ 4

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

FUNC() →

%% Сделайте что-нибудь   %% Затем отправьте сообщение родителям
  родитель! ПОСЛАНИЕ.

...

register (parent, self()),
spawn (MODULE, FUNC, [ARGS]).

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