При запуске этого кода в консоли 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>)```
При запуске этого кода в консоли 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>)```
Это происходит потому, что процесс, который вы порождаете, завершается очень быстро: он только «возвращает» строку (и возвращаемое значение никуда не девается, так как это функция верхнего уровня в стеке вызовов нового процесса), поэтому он, скорее всего, завершится. до того, как эмулятор перейдет к вызову 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"
.