Erlang最开始是为了电信产品而发展起来的语言,因为这样的目的,决定了她对错误处理的严格要求。Erlang除了提供exception,try catch等语法,还支持Link和Monitor两种监控进程的机制,使得所有进程可以连接起来,组成一个整体。当某个进程出错退出时,其他进程都会收到该进程退出的消息通知。有了这些特点,使用erlang建立一个简单,并且健壮的系统就不是什么难事。

进程双向监控-Link

link方式可以建立进程之间的双向链接关系,当其中一个进程退出时,另一个进程会收到该进程退出的消息。

例子1:

  1. -module(test).
  2. -export([start/0]).
  3. start() ->
  4. Pid = spawn(fun() ->loop() end),
  5. Pid2 = spawn(fun() ->loop_link(Pid) end),
  6. io:format("Pid ~p~nPid2 ~p~n", [Pid,Pid2]).
  7. loop_link(Pid) ->
  8. process_flag(trap_exit, true),
  9. erlang:link(Pid),
  10. receive
  11. Msg ->
  12. io:format("pid exit: ~p~n", [Msg])
  13. end.
  14. loop() ->
  15. process_flag(trap_exit, true),
  16. receive
  17. Msg ->
  18. io:format("pid2 exit: ~p~n", [Msg])
  19. end.

运行代码:

  1. 1> test:start().
  2. Pid <0.63.0>
  3. Pid2 <0.64.0>
  4. ok
  5. %% 杀掉Pid进程,进程Pid2收到通知
  6. 2> exit(pid(0,63,0),kill).
  7. pid exit: {'EXIT',<0.63.0>,killed}
  8. true
  9. 3> test:start().
  10. Pid <0.67.0>
  11. Pid2 <0.68.0>
  12. ok
  13. %% 杀掉Pid2进程,进程Pid收到通知
  14. 4> exit(pid(0,68,0),kill).
  15. pid2 exit: {'EXIT',<0.68.0>,killed}
  16. true

注:erlang进程默认不捕捉Exit信号,可以使用process_flag(trap_exit, true)改变这一默认行为。

注2:解除link监控用erlang:unlink(Pid)

进程单向监控-Monitor

Monitor方式则实现进程的单向监控,当被监控进程退出时,监控进程会收到该进程退出的消息。

例子2:

  1. -module(test).
  2. -export([start/0]).
  3. start() ->
  4. Pid = spawn(fun() ->loop() end),
  5. Pid3 = spawn(fun() ->loop_monitor(Pid) end),
  6. io:format("Pid ~p~nPid3 ~p~n", [Pid,Pid3]).
  7. loop_monitor(Pid) ->
  8. _MonitorRef = erlang:monitor(process, Pid),
  9. receive
  10. Msg ->
  11. io:format("pid exit: ~p~n", [Msg])
  12. end.
  13. loop() ->
  14. receive
  15. Msg ->
  16. io:format("pid3 exit: ~p~n", [Msg])
  17. end.

运行代码:

  1. 1> test:start().
  2. Pid <0.39.0>
  3. Pid3 <0.40.0>
  4. ok
  5. %% 杀掉Pid进程,进程Pid3收到通知
  6. 2> exit(pid(0,39,0),kill).
  7. pid exit: {'DOWN',#Ref<0.0.0.80>,process,<0.39.0>,killed}
  8. true
  9. 3> test:start().
  10. Pid <0.43.0>
  11. Pid3 <0.44.0>
  12. ok
  13. %% 杀掉Pid3进程,进程Pid没有收到通知
  14. 4> exit(pid(0,44,0),kill).
  15. true

注:解除monitor监控用erlang:demonitor(MonitorRef)

如果进程是以 normal 方式退出,erlang将不会发出进程退出通知

  1. 10> exit(pid(0,70,0), normal).
  2. true

转自: http://blog.csdn.net/mycwq/article/details/13171117

erlang进程监控:link和monitor的更多相关文章

  1. Erlang进程的Link机制

    这篇文章还不是最终版,有时间时,我会再来补充完善. 什么是link Erlang程序基于进程建模,进程之间的交互机制有收发消息,link和monitor.其中,收发消息通常用于正常的进程间通讯,而li ...

  2. erlang link 与 monitor

    erlang设计中,通常会有这样一个需求: 某一个进程必须依赖于令一个进程的概念,在这样的情况下就必须对两个进程之间建立一个监控或者说连接关系,以监听对方的死亡情况. erlang 提供了两个这样的方 ...

  3. 【转载】Erlang 中 link 和 monitor 的区别

    Link and Monitor differences 原文地址 Introduction link/1 and monitor/2 are 2 different ways of notifyin ...

  4. 【SFTP】使用Jsch实现Sftp文件下载-支持断点续传和进程监控

    参考上篇文章: <[SFTP]使用Jsch实现Sftp文件下载-支持断点续传和进程监控>:http://www.cnblogs.com/ssslinppp/p/6248763.html  ...

  5. linux 进程监控和自动重启的简单实现(转)

    目的:linux 下服务器程序会因为各种原因dump掉,就会影响用户使用,这里提供一个简单的进程监控和重启功能. 实现原理:由定时任务crontab调用脚本,脚本用ps检查进程是否存在,如果不存在则重 ...

  6. Zabbix4.0添加端口和进程监控

    一:Zabbix设置主动模式: vim /etc/zabbix/zabbix_agent.conf Server=192.168.1.10 #被动模式的serverip地址,如果设置纯被动模式,可以注 ...

  7. zookeeper编程入门系列之zookeeper实现分布式进程监控和分布式共享锁(图文详解)

    本博文的主要内容有 一.zookeeper编程入门系列之利用zookeeper的临时节点的特性来监控程序是否还在运行   二.zookeeper编程入门系列之zookeeper实现分布式进程监控 三. ...

  8. windows 进程监控 Procmon.exe

    windows 进程监控 Procmon.exe window下一个程序打开太慢,可以用此程序监控.在哪一步慢了,读取文件还是注册表. ProcessMonitor3.2 Process Monito ...

  9. Zookeeper概念学习系列之zookeeper实现分布式进程监控

    不多说,直接上干货! 假设要监控多台服务器上的A程序运行状态, 当发现有服务器上的A程序下线的时候, 给管理员发短信, 并且尝试重启A程序. zookeeper实现分布式进程监控主要利用zk的临时节点 ...

随机推荐

  1. 使用C#的BitmapData

    原文发布时间为:2009-01-16 -- 来源于本人的百度文章 [由搬家工具导入] 我在前两篇图片处理的文章里几乎都用BitmapData来做图片处理的,那么这个东东究竟是个什么玩意儿呢? C#好是 ...

  2. sokect数据压缩实现

    上一篇文章说到了用Java Socket来传输对象,但是在有些情况下比如网络环境不好或者对象比较大的情况下需要把数据对象进行压缩然后在传输,此时就需要压缩这些对象流,此时就 可以GZIPInputSt ...

  3. 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---52

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:

  4. 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---47

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:

  5. Python 数据类型-3

    字典 (dict) Python中唯一的映射的类型(哈希表) 字典对象是可变的,但是字典的键必须使用不可变的对象,一个字典可以使用不同类型的键值 定义字典: In [68]: dic = {} #使用 ...

  6. cobbler一键部署centos7.4(脚本)

    执行脚本之前你需要做四件事 1. 关闭防火墙 2.关闭selinux 3.配置163或者阿里云的 yum源 4.上传centos7.4的镜像如下图 [root@cobbler ~]# cat auto ...

  7. TreeMap和TreeSet的区别与联系

    TreeMap 和 TreeSet 是 Java Collection Framework 的两个重要成员,其中 TreeMap 是 Map 接口的常用实现类,而 TreeSet 是 Set 接口的常 ...

  8. 创建一个vue-cli项

    一.vue cli脚手架 Vue 提供了一个官方的cli,为单页面应用 (SPA) 快速搭建繁杂的脚手架,通过这个工具我们就可以很方便的来创建一个基于vue的项目. 二.安装一些必要的东西node.n ...

  9. GestureDetector 完全解析

    个人原创 OnDown(MotionEvent e):用户触发DonenEvent就会执行onShowPress(MotionEvent e):用户触发DonenEvent后,在很短大概0.5秒内,没 ...

  10. HTML小技巧将table边框改为细线

    HTML制作新手在用TABLE表格时,会碰到如何改变边线粗线,因为默认的TABLE边线设置即使是1px 是很粗的.因此会使用其他一些方法来制作出细线边框,这里介绍一种利用CSS来实现细线的方法,很有效 ...