代码一:
-module(exit_demo).
-export([start_a/0,start_b/1,af1/1]).
start_a()->
spawn(fun af/0).
af()->
io:format("process a created."),
%%process_flag(trap_exit,true),
receive
{'EXIT',_Pid,abc} ->
io:format("kill"),
af();
%%{'EXIT',_Pid,normal} ->
%% io:format("normal");
{'EXIT',_Pid,kill} ->
io:format("kill"),
af()
end.
start_b(Pid)->
spawn(exit_demo,af1,[Pid]).
af1(Pid)->
link(Pid),
exit(normal),
receive
X -> X
end.
代码二:
-module(exit_demo).
-export([start_a/0,start_b/1,af1/1]).
start_a()->
spawn(fun af/0).
af()->
io:format("process a created."),
%%process_flag(trap_exit,true),
receive
{'EXIT',_Pid,abc} ->
io:format("kill"),
af();
%%{'EXIT',_Pid,normal} ->
%% io:format("normal");
{'EXIT',_Pid,kill} ->
io:format("kill"),
af()
end.
start_b(Pid)->
spawn(exit_demo,af1,[Pid]).
af1(Pid)->
link(Pid),
exit(Pid,normal),
receive
X -> X
end.
代码三:
-module(exit_demo).
-export([start_a/0,start_b/1,af1/1]).
start_a()->
spawn(fun af/0).
af()->
io:format("process a created."),
process_flag(trap_exit,true),
receive
{'EXIT',_Pid,abc} ->
io:format("kill"),
af();
%%{'EXIT',_Pid,normal} ->
%% io:format("normal");
{'EXIT',_Pid,kill} ->
io:format("kill"),
af()
end.
start_b(Pid)->
spawn(exit_demo,af1,[Pid]).
af1(Pid)-> link(Pid),exit(Pid,normal),receive X -> X end.
代码四:
-export([start_a/0,start_b/1,af1/1]).
start_a()->
spawn(fun af/0).
af()->
io:format("process a created."),
process_flag(trap_exit,true),
receive
{'EXIT',_Pid,abc} ->
io:format("kill"),
af();
{'EXIT',_Pid,normal} ->
io:format("normal");
{'EXIT',_Pid,kill} ->
io:format("kill"),
af()
end.
start_b(Pid)->
spawn(exit_demo,af1,[Pid]).
af1(Pid)->
link(Pid),
exit(Pid,normal),
receive
X -> X
end.
代码五:
-export([start_a/0,start_b/1,af1/1]).
start_a()->
spawn(fun af/0).
af()->
io:format("process a created."),
process_flag(trap_exit,true),
receive
{'EXIT',_Pid,abc} ->
io:format("kill"),
af();
{'EXIT',_Pid,normal} ->
io:format("normal");
{'EXIT',_Pid,kill} ->
io:format("kill"),
af()
end.
start_b(Pid)->
spawn(exit_demo,af1,[Pid]).
af1(Pid)->
link(Pid),
exit(Pid,kill),
receive
X -> X
end.
代码六
-export([start_a/0,start_b/1,af1/1]).
start_a()->
spawn(fun af/0).
af()->
io:format("process a created."),
process_flag(trap_exit,true),
receive
{'EXIT',_Pid,abc} ->
io:format("kill"),
af();
{'EXIT',_Pid,normal} ->
io:format("normal");,
%%{'EXIT',_Pid,kill} ->
%%io:format("kill"),
%% af()
end.
start_b(Pid)->
spawn(exit_demo,af1,[Pid]).
af1(Pid)->
link(Pid),
exit(Pid,kill),
receive
X -> X
end.
分布执行
Pid = exit_demo:start_a().
Pid1 = exit_demo:start_a(Pid).
erlang:is_process_alive(Pid).
erlang:is_process_alive(Pid1).
分别查看输出的结果,并且思考原因。
下面总结几个小点:1,当一个进程死掉之后,一条退出信号会广播给所有和这个进程有link的进程
2,这个信号的会包括退出原因,但是这个原因有可能是任何erlang的数据结构
3,进程可以使用exit(Reason)来使自己退出
4,eixt(Pid,Reason),如果Pid进程是普通进程,那么普通进程将会退出,如果
Pid进程是系统进程,那么当Reason不是kill时,系统进程不管是否捕获发来的
消息,系统进程都不会退出,但是如果Reason是kill时,那么不管该进程是什么
类型的进程都将退出。而当前的进程处于假死状态,还会继续存活着。进程完成
了自己的工作而退出的时候,这时候的退出原因是normal,其他进程(必须是系统
进程)收到的消息是{'EXIT',Pid,normal},而普通进程却不能捕获任何信息,并且
不会退出
system process
1,调用process_flag(trap_exit,true)就可以将一个普通的进程编程系统进程
2,到一条非normal的退出信号送到一个普通进程的时候,普通进程就会挂掉
3,如果是到一个系统进程的话,将会把这个退出信号打包成一条普通的消息
{'EXIT',Pid,Why}存放在邮箱里
4,另外,可以发送一个kill消息给一个进程,无论是不是系统进程,进程都
将挂掉,并且广播一个killed的消息给链接的进程,这个功能要小心使用,一
般是系统来杀掉没事干的进程用的
分享到:
相关推荐
Erlang进程模型特点 一个进程可以创建数以万计的轻量级进程 每个轻量级进程仅仅完成单一功能 一个复杂的功能可以由多个轻量级进程协同完成 当遇到file或socket等阻塞的io时, 调用的轻量级进程被阻塞,整个进程不...
Worker Pool 是一个Erlang进程池,其中的工作进程是Erlang的gen server模式进程。Worker Pool的目标是非常简单: 提供以透明的方式管理一批工作进程并且对分配到池中的任务尽最大努力实现负载均衡。一个 Echo 服务器...
关于erlang并发开发的一些例子,便于学习supersivor
● 并发性 - Erlang支持超大量级的并发进程,并且不需要操作系统具有并发机制。 ● 分布式 - 一个分布式Erlang系统是多个Erlang节点组成的网络(通常每个处理器被作为一个节点) ● 健壮性 - Erlang具有多种基本的...
个人学习Erlang对于Erlang处理数据的各种方式的总结,讲述编程语言Erlang的ets,dets,mnesia,mysql,dict,和进程字典的用法,希望能帮助读者在这个总结里学到一些东西.
●外部接口-Erlang进程与外部世界之间的通讯使用和在Erlang进程之间相同的消息传送机制。 ●Fail-fast(中文译为速错),即尽可能快的暴露程序中的错误。 ●面向并发的编程(COP concurrency-oriented programming) ...
使用Erlang编写出的应用运行时通常由成千上万个轻量级进程组成,并通过消息传递相互通讯。进程间上下文切换对于Erlang来说仅仅 只是一两个环节,比起C程序的线程切换要高效得多得多了。 使用Erlang来编写分布式应用...
erlang入门电子书 erlang编程 Introducing Erlang,作者Simon.St.Laurent
●外部接口-Erlang进程与外部世界之间的通讯使用和在Erlang进程之间相同的消息传送机制。 ●Fail-fast(中文译为速错),即尽可能快的暴露程序中的错误。 ●面向并发的编程(COP concurrency-oriented ...
基于ETS的Erlang进程的Erlang循环负载均衡器 erlpool做什么 Erlpool是用于Erlang进程的循环负载均衡器,主要用于与数据库连接之类的事情。 与和相比, erlpool非常简单且很小(〜100 LOC),并且没有关于工人的假设...
在 Erlang VM 中将 Linux VM 作为 Erlang 进程生成。 evum 使 Linux 虚拟机成为 Erlang actor。 虽然 Linux VM 像任何其他进程(内存、系统进程、磁盘)一样拥有自己的状态,但与外部世界的所有 I/O 都是通过 ...
erlang 安装包
varpool:Erlang进程池作为局部变量
Erlang及其应用Erlang及其应用Erlang及其应用
ErlangB和ErlangC计算工具(exe可执行文件+excel两个) ErlangB和ErlangC计算工具(exe可执行文件+excel两个)
erlang25.0 windows版本
erlang otp25 win安装包
erlang22最新下载包 erlang22.1.tar.gz erlang22最新下载包 erlang22最新下载包
Erlang入门:构建application练习4(进程link的作用),实例演示进程link的作用及效果
gproc, Erlang的扩展进程注册表 gproc应用程序作者: 超级用户,约瑟夫 Wayne 。扩展进程字典 注释Gproc有两个依赖项:gen_leader 和 edown 。 由于大多数人都不积极使用,所以默认情况下它们不再被获取。要启用 gen...