`
jjchen_lian
  • 浏览: 84279 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

erlang学习一

阅读更多
经过一个下午的努力,终于把问题解决了。跟一个在网上认识的Erlang也是初学者,但是在java,vc是高手的前辈讨论了一下。像Erlang这种东西真的要多多动手,光看书真的很不够,尤其看erlang程序设计这本书,我个人觉的字字是宝,但是里面很多文字,经常性看了而不能把关键性的地方给记住,就像今天,就是没注意书中的话,导致各种调试都发现不知为什么。


-module(process_test).
-export([start_a/0,start_b/1,af1/1]).

start_a()->
    spawn(fun af/0).
    
af()->
    io:format("process a created."),
    receive       
        {hello,X,Y} ->
            io:format("Receive hello.~p~n",[X*Y]),
            af();
        stop ->
            io:format("Receive abc. ~p~n",[abc]),
            af();
        abcd ->
            io:format("Receive abcd. ~p~n",[abcd]),
            af()
   
    end.

start_b(Pid)->
    spawn(process_test,af1,[Pid]).

af1(Pid)->
    link(Pid),
    exit(Pid,stop),
    receive 
        Y->Y
    end.

命令行下调用:
c(process_test).
Pid = process_test:start_a().
Pid1 = process_test:start_b(Pid).
坑爹,发现Pid进程没有收到exit(Pid,stop)发出退出的信息。而且调用
erlang:is_process_alive(Pid)
erlang:is_process_alive(Pid1)
都返回了false..说明Pid进程没有收到exit(Pid,stop)发出的信息。。。。为什么会这样呢?于是重新在erlang程序实际一书寻找打算。结果发现这样一段话:
"你在进程Pid1中调用exit(Pid2,X),就可以让Pid1显式地向一个进程Pid2发送一个退出信号X。发送退出信号的进程没有死亡,发送信号后它会继续执行。但是Pid2仍然会收到一个{'EXIT',Pid1,X}消息(前提是它正处于退出信号捕获状态),这与同源进程已经消亡时发生的情况完全相同。使用这个方法,Pid1可以装死(这通常是故意的)."于是我把代码修改成:
-module(process_test).
-export([start_a/0,start_b/1,af1/1]).

start_a()->
    spawn(fun af/0).
    
af()->
    io:format("process a created."),
    receive
        {'EXIT',Pid,Why} ->
            io:format("Receive hello.~p~n",[Why]);
            
        {hello,X,Y} ->
            io:format("Receive hello.~p~n",[X*Y]),
            af();
        abc ->
            io:format("Receive abc. ~p~n",[abc]),
            af();
        abcd ->
            io:format("Receive abcd. ~p~n",[abcd]),
            af()
   
    end.

start_b(Pid)->
    spawn(process_test,af1,[Pid]).

af1(Pid)->
    link(Pid),
    exit(Pid,stop),
    receive 
        Y->Y
    end.

同样的调用还是不行。。这到底是为什么啊,难道是书上出现了。于是就一个下午的找资料。到最后还是重新看看Erlang程序设计,结果又发现新收获:
"系统进程:当进程接收到一个非正常的退出信号时它自己也会消亡,除非它是那种特殊类型的进程即系统进程。当Pid进程向一个系统进程发送一个内容为Why的退出信号时,系统会把退出信号转换为消息{'EXIT',Pid,Why}然后送入系统进程的邮箱".
看来接收exit(Pid,stop)发出的信息必须要是系统进程啊。。。于是重新修改代码
-module(process_test).
-export([start_a/0,start_b/1,af1/1]).

start_a()->
    spawn(fun af/0).
    
af()->
    io:format("process a created."),
    process_flag(trap_exit,true),
    receive
        {'EXIT',Pid,Why} ->
            io:format("Receive hello.~p~n",[Why]);
            
        {hello,X,Y} ->
            io:format("Receive hello.~p~n",[X*Y]),
            af();
        abc ->
            io:format("Receive abc. ~p~n",[abc]),
            af();
        abcd ->
            io:format("Receive abcd. ~p~n",[abcd]),
            af()
   
    end.

start_b(Pid)->
    spawn(process_test,af1,[Pid]).

af1(Pid)->
    link(Pid),
    exit(Pid,stop),
    receive 
        Y->Y
    end.

重新调用,OK了,一切都正常,可以接收exit发送的信号。。。
看来只有系统进程才能接收exit()发出的信号。。。

另外从这个例子重新发现了一点,见代码
-module(process_test).
-export([start_a/0,start_b/1,af1/1]).

start_a()->
    spawn(fun af/0).
    
af()->
    io:format("process a created."),
    process_flag(trap_exit,true),
    receive     
        {hello,X,Y} ->
            io:format("Receive hello.~p~n",[X*Y]),
            af();
        abc ->
            io:format("Receive abc. ~p~n",[abc]),
            af();
        abcd ->
            io:format("Receive abcd. ~p~n",[abcd]),
            af()
   
    end.

start_b(Pid)->
    spawn(process_test,af1,[Pid]).

af1(Pid)->
    link(Pid),
    exit(Pid,stop),
    receive 
        Y->Y
    end.

就是把    {'EXIT',Pid,Why} ->
            io:format("Receive hello.~p~n",[Why]);注释掉。。
那么就是exit()发出的信号系统进程没有接收处理,如果一般进程不管有没有这段代码这个进程都会退出,除非是exit(normal)才不会退出,但是对于系统进程来说是不会的退出,系统进程退出只要在接收Kill才会退出。
分享到:
评论

相关推荐

    erlang学习1.pdf

    erlang学习1.pdferlang学习erlang学erlang学习1.pdf习1.pdf1.pdf

    Erlang并发编程,Erlang程序设计,Erlang中文手册

    学习erlang的好资料。  Erlang是一个结构化,动态类型编程语言,内建并行计算支持。最初是由爱立信专门为通信应用设计的,比如控制交换机或者变换协议等,因此非常适 合于构建分布式,实时软并行计算系统。 使用...

    硝烟中的erlang

    在程序员学习新的语言和环境时,都需要一个摸索 阶段,也就是学会在社团的帮助下,脱离指南,解决实际问题。 本书假设读者精通基本的Erlang和OTP框架。在本书中,会对一些难以理解Erlang/OTP特性进 行解释,另外,...

    erlang 学习笔记1

    NULL 博文链接:https://jias.iteye.com/blog/615679

    Erlang进程模型学习PPT

    Erlang进程模型特点 一个进程可以创建数以万计的轻量级进程 每个轻量级进程仅仅完成单一功能 一个复杂的功能可以由多个轻量级进程协同完成 当遇到file或socket等阻塞的io时, 调用的轻量级进程被阻塞,整个进程不...

    Erlang程序设计及源代码打包

    Joe Armstrong [Erlang程序设计].中文版 和随书源代码 一本不错的Erlang学习书籍!

    erlang聊天室源码

    附有需求文档,设计文档,以及一些说明文档,简单的聊天室功能,适合初学者阅读,是本人学习erlang过程中写的,参照了rabbitMQ的核心模块

    一个我自己学习Erlang的聊天室服务器及客户端代码

    里面包含Server端Erlang代码和Client端JAVA代码。编写过程在我博客里。

    [Erlang程序设计].中文版.pdf

    Joe Armstrong [Erlang程序设计].中文版 一本不错的Erlang学习书籍~!

    erlang api 最新资源

    学习 Erlang一个非常重要的内容就是模式匹配 但是请不要混淆 这个匹配和正则表达式没有任何干系 ">1 简单小巧 Erlang中只有 8种基本的数据类型: integer float atom reference fun port pid bitstring 同时提供 2...

    21天erlang

    从软件安装到命令行执行,语法解析,深入浅出地介绍erlang,适合erlang初学者使用的学习文档

    Erlang 教程中文版 - 极客学院

    本教程目的是告诉你如何快速高效地学习 Erlang 语言。教程中只讲述了 Erlang 的一些简单语法形式,而没有包 括所有复杂难懂的语法形式。此外,语法极大简化后的部分都使用 *manual* 标识出来了。

    gErl:用于机器学习的通用Erlang编码的强化学习范例[THESIS]

    这使我们能够提出一种学习范例,用户可以根据问题,数据表示形式和信息导航方式来编写(或改编)他们的运算符。 为了实现此目标,数据实例,背景知识,规则,程序和运算符均以相同的功能语言Erlang编写。 由于不断...

    学到一些Erlang,以造福所有人!Learn You Some Erlang for Great Good!

    本书是为那些具有命令式语言编程基础知识(例如C / C ++,Java,Python,Ruby等)并且可能会或可能不知道函数式编程(例如Haskell,Scala,Erlang)的人们学习Erlang的一种方法。 ,Clojure,OCaml等)。

    Erlang程序设计(第2版)

    erlang程序设计 教程 语言学习 学习erlang第一本书 初学者

    Matlab Erlang分布随机数.zip

    1.版本:matlab2014/2019a,内含运行结果,不会运行可私信 2.领域:智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,更多内容可点击博主头像 3.内容:标题...

    erlang资源

    学习资源汇总,一个压缩包。汇总了我学习erlang的资料

    Erlang程序设计中文版

    Erlang是一种通用的面向并发的编程语言,它由瑞典电信设备制造商爱立信所辖的CS-Lab开发,目的是创造一种可以应对大规模并发活动的编程...本书是目前公认的最好的一本Erlang中文版书籍,希望对您学习Erlang有所帮助。

    erlang_win64缩缩卷1

    erlang是一种高并发、分布式、软实时、容错性高的函数式开发语言,非常容易开发分布式系统,这是最新的win64版本,分为两卷,这是第一卷,热爱学习的同学可以下载下来学习。只所以要分,主要是本人特爱下载资源,赚点...

Global site tag (gtag.js) - Google Analytics