controlling process in erlang
昨天写测试代码的时候,遇到了一些疑惑,那就是erlang中control process.
在使用gen_tcp进行开发的时候,我们可以通过调用gen_tcp:accept和gen_tcp:connect而产生socket,此时调用所在的process,称为这个socket的control process. control process的生存期控制着socket的生存期,如果control process结束了,那么Socket也会被关闭.要解除这个约束的方法是调用gen_tcp:controlling_process/2, 为Socket设置一个新的control process.
参看erlang-china中a pitfall in passing socket via processes 一文:
在花了大半天“追根究底”之后,发现原因是这样的:“socket 是通过 port 实现的,如果这个 port 的 owner process 退出,那么这个 port 也会关闭”。
让我们在通过一个例子来更深的理解一下:
-module(r3).
-compile(export_all).
start() ->
spawn(r3, start, ["www.erlang.org", 80]).
start(RHost, RPort) ->
io:format(”start:pid=~p~n”, [...]