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. eclipse在linux下无故闪退解决

    A fatal error has been detected by the Java Runtime Environment: SIGSEGV (0xb) at pc=0x00007f25d0b92 ...

  2. win10下怎么配置以KDiff3作为merge tool和diff tool

    系统环境: OS: Windows 10 Git 2.6.1.windows.1 KDiff3 0.9.98 (64 bit) 具体代码如下: git config --global --add me ...

  3. linux内核情景分析之匿名管道

    管道的机制由pipe()创建,由pipe()所建立的管道两端都在同一进程.所以必须在fork的配合下,才可以在具有亲缘关系的进程通信 /* * sys_pipe() is the normal C c ...

  4. locust参数关联及批量注册

    前言 前面[Locust性能测试2-先登录场景案例]讲了登录的案例,这种是直接传账号和密码就能登录了,有些登录的网站会复杂一点,需要先从页面上动态获取参数,作为登录接口的请求参数,如[学信网:http ...

  5. 关于expect脚本输出的问题

    写了一个expect脚本 执行ssh命令远程登录 然后telnet另外一台机器 大致如下: #!/usr/bin/expect -f set timeout set port_type [lindex ...

  6. hdu 1573(中国剩余定理)

    X问题 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  7. Eclipse 导入项目乱码问题

    1.编码不对 a.对某文件或某工程更改编码: 鼠标移到工程名或文件名,右键->Properties->Resource->Text file enCoding ->更改编码(G ...

  8. eclipse主题样式

    Eclipse Color Themeshttp://eclipsecolorthemes.org/ Get it Download from Eclipse Marketplace Install ...

  9. 【WEB基础】HTML & CSS 基础入门(8)表单

    前面 前面我们已经熟悉了网页上一些常见的元素,如在网页上显示一段文字.一张图片.一个列表.一张表格等等.这些东西都是事先编辑好显示在页面上只提供给用户看的,实际上,我们可以把这样的页面称之为静态页面. ...

  10. gtest 自动化测试 部署

    1.部署 a)编译框架 1.1下载gtest库1.6.0 并解压到文件夹 "/user/{user}/gtest.1.6.0" 下载地址:https://code.google.c ...