Erlang порождает простой процесс из erl .. нет такого процесса или порта

При запуске этого кода в консоли Erlang

Pid = spawn(fun() -> "foo" end),link(Pid),receive X -> X end.

Я получаю следующую ошибку.

** exception error: no such process or port
 in function  link/1
    called as link(<0.71.0>)```

person bryan_basho    schedule 04.07.2014    source источник


Ответы (1)


Это происходит потому, что процесс, который вы порождаете, завершается очень быстро: он только «возвращает» строку (и возвращаемое значение никуда не девается, так как это функция верхнего уровня в стеке вызовов нового процесса), поэтому он, скорее всего, завершится. до того, как эмулятор перейдет к вызову link.

Вы можете сделать его более вероятным, сделав процесс спящим перед выходом:

2> Pid = spawn(fun() -> timer:sleep(1000), "foo" end),link(Pid).
true

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

Parent = self(),
spawn(fun() -> Parent ! "foo" end),
receive X -> X end.

Это возвращает "foo".

person legoscia    schedule 04.07.2014