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. .net web api ioc unity usage

    1.use nuget to install unity.webapi 2.add configurations in application_start folder using Microsoft ...

  2. 【jetty】jetty服务器的使用

    1.下载jetty服务器: http://www.eclipse.org/jetty/previousversions.html 2.下载后解压:

  3. 【转】CentOS 6.0 系统 LAMP(Apache+MySQL+PHP)安装步骤

    一.安装 MySQL 首先来进行 MySQL 的安装.打开超级终端,输入: [root@localhost ~]# yum install mysql mysql-server 安装完毕,让 MySQ ...

  4. Java发送邮件--web.xml配置,Java代码配置

    前言:我目前总结的使用java发送邮件的方式有两种,分别是在spring框架xml配置文件使用bean标签,另一种方法是把发送功能封装成一个对象,废话不多说上代码, 边看代码边讲解,希望对需要的人能有 ...

  5. 51nod 1050 循环数组最大子段和【环形DP/最大子段和/正难则反】

    1050 循环数组最大子段和 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 N个整数组成的循环序列a[1],a[2],a[3],…,a[n],求该 ...

  6. POI 2014 HOTELS (树形DP)

    题目链接 HOTELS 依次枚举每个点,以该点为中心扩展. 每次枚举的时候,从该点的儿子依次出发,搜完一个儿子所有的点之后进行答案统计. 这里用了一个小trick. #include <bits ...

  7. Codeforces 509E Pretty Song (思维)

    E. Pretty Song                                                            time limit per test:1 seco ...

  8. 首次尝试Flink的一些感受

    最近打算研究研究 Flink,根据官方文档写个 Hello,World.入门还是比较容易的,不需要复杂的安装环境.配置.这篇文章简单介绍 Flink 的使用感受以及入门. 感受 搭建环境方便:Flin ...

  9. LoadRunner安装破解

    安装过程 1. 运行“setup.exe” 点击安装,其中会有提示缺少“Microsoft Visual C++ 2005 SP1等运行组件”,下载这些组件.这里安装“vcredist_x86.exe ...

  10. codevs——1169 传纸条(棋盘DP)

    2008年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description 小渊和小 ...