Erlang从erl中生成简单的进程..没有这样的进程或端口

时间:2014-07-04 22:10:40

标签: erlang erlang-shell

在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>)```

1 个答案:

答案 0 :(得分:6)

这是因为你生成的进程很快完成:它只“返回”一个字符串(并且返回值无处可去,因为它是新进程的调用堆栈中的顶级函数),所以它非常可能在模拟器进入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"