经过一个下午的努力,终于把问题解决了。跟一个在网上认识的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学习知识点 #### 一、Erlang简介与安装 - **Erlang**是一种通用、并发、函数式编程语言,适用于构建高可用性系统。它在电信行业有广泛应用,同时也被用于互联网服务、分布式计算等领域。 - **安装步骤**...
1. **函数式编程基础**:Erlang是纯函数式语言,这意味着程序中的函数没有副作用,只依赖于输入参数,不改变外部状态。理解函数式编程的核心概念,如不可变数据、高阶函数和模式匹配,是学习Erlang的基础。 2. **...
### Erlang多核编程入门知识点总结 #### 一、Erlang多核编程背景与重要性 - **多核时代的来临**:随着技术的发展,单个芯片内部的...通过学习和掌握Erlang的多核编程技巧,开发者可以更加从容地面对多核时代的挑战。
【描述】虽然描述中没有具体的信息,但我们可以假设这是一个博主分享的关于Erlang学习的初步笔记,可能涵盖了基本语法、并发模型以及一些实用工具的使用。 【标签】"源码"和"工具"提示我们,这篇笔记可能包括了...
### Erlang 入门学习经典资料解析 #### Erlang 的神秘与起源 Erlang,作为一门相对小众但极具特色的编程语言,自问世以来便伴随着一种神秘的气息。这种神秘感不仅源于它独特的编程范式——函数式编程,还在于其...
在这个“erlang 连接学习例子”中,我们有两个核心文件:`server.erl` 和 `client.erl`,它们分别代表了一个服务器进程和客户端进程,展示了Erlang中进程间的通信机制。 `server.erl` 文件通常包含一个持续运行的...
这份"Erlang游戏程序学习完整PDF手册"是一份全面介绍Erlang在游戏开发中应用的学习资料,包含了Erlang的基础知识、并发原理以及在游戏开发中的实践案例。 Erlang语言的设计理念源自于Ericsson公司为解决电信系统中...
在文档“erlang学习2.pdf”中,作者通过一系列示例和代码介绍了Erlang语言的基本概念及其在网络编程中的应用。本篇将围绕文档中的核心知识点进行深入解读,主要包括:构建一个简单的HelloServer、Table的并发消息...
### Erlang学习:支持多个连接的TableServer及进程通信详解 #### 一、引言 在Erlang的学习过程中,理解和掌握如何构建能够处理多个连接的服务器是非常重要的一步。本篇文档将详细介绍如何通过Erlang语言实现一个...
Simon St. Laurent的《Introducing Erlang》这本书深入浅出地介绍了这些概念,是学习Erlang的理想起点。通过阅读这本书,读者将能够理解Erlang如何处理并发、分布式计算和故障恢复,从而构建高效、健壮的软件系统。
Erlang是一种面向并发的、函数式编程语言,由瑞典...这两本书结合阅读,将为初学者提供一个全面的Erlang学习路径,从基础语法到高级并发编程技巧,有助于深入理解Erlang语言及其在构建高并发、分布式系统中的强大能力。
1. **理解基本语法**:通过解决课后习题,学习者可以熟悉Erlang的基本语法,如变量、函数定义、模式匹配、列表操作等。 2. **掌握并发编程**:习题可能包含创建和管理Erlang进程、实现进程间的消息传递,帮助学习者...
Erlang作为一种专为构建高并发、高可用性系统而设计的编程语言,其核心特性之一就是强大的分布式处理能力。本篇文档旨在深入解析Erlang的分布式调用机制及分布式TableServer的相关实现细节,帮助读者更全面地理解...
学习Erlang时,你需要掌握以下核心概念: - **BEAM虚拟机**:Erlang的运行时系统,全称是BIFs (Built-In Functions)、Erlang、Assembler and Memory管理器。 - **OTP行为**:如Supervisor(监督者)、GenServer...
#### 一、Erlang编程语言概述 Erlang是一种功能强大的编程语言,专为编写并发应用而设计。它最初由爱立信开发,旨在处理大规模分布式系统的通信需求。Erlang的核心优势在于其对并发的支持,这使得它非常适合构建高...
1. Erlang Shell Erlang Shell 是一个交互式的编程环境,用户可以在其中编写和运行代码。用户可以在 Erlang Shell 中输入命令,例如数学运算符号,函数调用等。Erlang Shell 提供了一个交互式的环境,用户可以实时...
1. 通信协议:由于Erlang和Java是不同的语言,它们之间的通信需要一个明确的协议。这可能是一个自定义的基于TCP/IP的协议,或者使用标准的协议如HTTP、WebSockets等。 2. Erlang-Java桥接库:为了方便Java与Erlang...
Erlang是一种面向并发的、函数式编程语言,由瑞典电信设备制造商Ericsson为了实现分布式实时、高可靠性系统而开发。...学习和掌握Erlang22的新特性有助于提升开发效率和应用质量,特别是在构建高并发、分布式系统时。
这个文件名可能指向一个包含额外Erlang学习资源的列表,如其他教程、文档、开源项目或社区论坛链接。这些资源可以帮助用户进一步深入学习Erlang语言和相关技术,提升开发技能。 总结来说,Erlang_CNode用户指南是为...
Erlang是一种面向并发的、函数式编程语言,由瑞典电信设备制造商Ericsson开发,用于构建高可用性、分布式和实时系统。...无论是为了个人兴趣还是职业发展,投入时间学习Erlang都将是一次富有成效的旅程。