2013-04-09 99 views
1

说我在erl一些简单的工作流程:当我做f(Pid).Erlang:当你f()中的一个Pid时会发生什么?

1> Fun = fun(F) -> F(F) end. 
#Fun<erl_eval.6.82930912> 
2> Pid = spawn(fun() -> Fun(Fun) end). 
<0.178.0> 
3> f(Pid). 

会发生什么?这个过程是否会退出?或者我只是失去了对它的引用?

回答

3

根据documentationf(Pid)删除变量Pid的绑定,进程不停止。

您可以用这种方式测试它:假设您有一个gen_server,名为myserver,它基于emacs erlang模式提供的骨架。

1> {ok, Pid} = myserver:start_link(). 
{ok,<0.39.0>} 
2> f(Pid). 
ok 
3> gen_server:call(pid(0,39,0), mycall). 
ok 
4> gen_server:call(myserver, mycall). 
ok 

正如你可以看到,即使我们做了f(Pid)我们可以在过程中使用的PID或注册时使用的原子(在我们的例子模块名称)依然取得联系。

+1

谢谢!我觉得文档含糊不清当你删除绑定时会发生什么,但是你的例子明确地说明了这一点。 – 2rs2ts 2013-04-09 14:43:56

+2

@agarrett仅仅因为没有对它们的引用,进程永远不会消失。当他们完成他们的功能,他们或者死亡,发生错误或者他们被另一个进程杀死。 – rvirding 2013-04-09 15:06:15

相关问题