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. java网络编程学习笔记(四):线程池的实现

    package QQ; import java.util.LinkedList; /** * Created by hu on 2015/11/9. */ public class ThreadPoo ...

  2. 谈谈JS中的原型

    不知道大家对JS中的原型理解的怎么样,我想如果大家对JS中的原型对象以及prototype属性十分熟悉的话对后面原型链以及继承的理解会十分的容易,这里想和大家分享自己对其的理解,请先看下面这段代码O( ...

  3. 一个关于集合的问题,为什么添加进List集合中的元素被莫名其妙的改变了

    以前自己理解的不够深刻,特此记录一下提醒自己,如果正好也帮到了你,我会很开心.相信只有自己正好遇到这个问题,才觉得哦,原来这样.自己小白,大神莫喷 为什么添加进List集合中的元素被莫名其妙的改变了? ...

  4. AC日记——[Ahoi2009]Seq 维护序列seq bzoj 1798

    1798 思路: 维护两个标记: 乘:m  和  加:a 先下放乘,再下放加: 下放乘的时候要把子节点的加一块乘了: 开long long: 来,上代码: #include <cstdio> ...

  5. java.lang.StackOverflowError at org.eclipse.jetty.util.resource.Resource.<init>(Resource.java:40)

    今天做项目的时候,不知道哪根筋搭错了,多写了一句话,导致我忙活了一下午,各种百度,最后在朋友的帮助下,给了我思路,完美解决,不多说,上图. 我的登录页面引入了bootstrap.jsp的东西 解决问题 ...

  6. httperf+autobench测试web应用

    测试性能相关的概念理解 httperf使用 主页:  http://www.hpl.hp.com/research/linux/httperf/ 下载: http://httperf.googleco ...

  7. Topcoder SRM 666 DIV 1

    WalkOverATree 题意:给你一棵树,有个人在节点0,现在问你,这个人走L步,最多能访问多少个不同的节点,一个节点可以被走多次,但只算一次. 题解:这个问题的关键在于,每个点最多走两次,这是因 ...

  8. Oracle的隔离级别

    隔离级别(isolation level)       隔离级别定义了事务与事务之间的隔离程度.     隔离级别与并发性是互为矛盾的:隔离程度越高,数据库的并发性越差:隔离程度越低,数据库的并发性越 ...

  9. CodeForces - 361D Levko and Array

    Discription Levko has an array that consists of integers: a1, a2, ... , an. But he doesn’t like this ...

  10. BZOJ 4543 2016北京集训测试赛(二)Problem B: thr 既 长链剖分学习笔记

    Solution 这题的解法很妙啊... 考虑这三个点可能的形态: 令它们的重心为距离到这三个点都相同的节点, 则其中两个点分别在重心的两棵子树中, 且到重心的距离相等; 第三个点可能在重心的一棵不同 ...