[Erlang]link进程信号详解
2015-06-27 23:54
190 查看
原创文章,转载请注明出处:服务器非业余研究http://blog.csdn.net/erlib 作者Sunface联系邮箱:cto@188.com估计很多同学都会对link时各种信号及捕捉机制有点迷糊,我这边在画一个表格,特分享给大家
假如有A,B两个进程且彼此link 1.当A的结束原因是normal时(进程正常执行完就是normal),B是不会退出的,此时link机制不发生作用 2.若A的结束原因是killed,例如调用exit(PidA,kill) ,则无论B是否有设置trap_exit,B都会terminate,此时退出信号捕捉机制是无效的 3.若A的结束原因不是normal也不是killed(例如exit(PidA,Reason)),那么B在设置了trap_exit时,会捕捉到退出信号,取而代之的是收取到一条消息{‘EXIT’,Pid,Reason},这时B不会结束,用户可以根据收到的消息对A进程的结束进行处理;若B没有设置trap_exit,B就会terminate
重要:若进程是gen_server且处于superviosr监控树下,那么在满足上述条件的同时,若要调用terminate函数来结束,还要满足两个条件: 1.trap_exit = true 2.supervisor的启动策略是一个超时时间而不是brutal kill
希望大家能把这些关系理清,在构建系统时,这些内在关系是非常重要的,希望每个人都能设计出层次清晰,耦合度合理的优秀架构
Reason | Trapping exits (trap_exit = true) | Not trapping exits (trap_exit = false) |
normal | Receives {'EXIT', Pid, Normal} | Nothing happens |
kill | Terminates with reason killed | Terminates with reason killed |
Other | Receives {'EXIT', Pid, Other} | Terminates with reason Other |
重要:若进程是gen_server且处于superviosr监控树下,那么在满足上述条件的同时,若要调用terminate函数来结束,还要满足两个条件: 1.trap_exit = true 2.supervisor的启动策略是一个超时时间而不是brutal kill
希望大家能把这些关系理清,在构建系统时,这些内在关系是非常重要的,希望每个人都能设计出层次清晰,耦合度合理的优秀架构
相关文章推荐
- Erlang项目内存泄漏分析方法
- Erlang实现的一个Web服务器代码实例
- Erlang并发编程介绍
- Erlang的一些编程技巧分享
- Erlang程序设计(第2版)读书笔记:Erlang安装和基础语法
- Erlang中的模块与模式匹配介绍
- Erlang中的函数与流程控制介绍
- Erlang语法学习笔记:变量、原子、元组、列表、字符串
- Erlang中的Record详解
- Erlang初学:Erlang的一些特点和个人理解总结
- Erlang中的OTP简介
- Erlang中遍历取出某个位置的最大值代码
- Erlang中3种生成随机数的方法
- Erlang中的并发程序简介
- Erlang分布式节点中的注册进程使用实例
- Erlang中的注册进程使用实例
- Erlang中的映射组Map详细介绍
- CentOS 6.5源码安装Erlang教程
- Erlang的运算符(比较运算符,数值运算符,移位运算符,逻辑运算符)
- Erlang实现的百度云推送Android服务端实例