这段程序一些地方参考:
写道
http://www.erlang.org/upload/klacke_examples/chargen.erl
依旧是erlang官网的一个example
自己独立写的时候 做了一个同步的版本 接下去改成异步
改成异步的时候没有把gen_tcp:listener那段独立到循环的进程中去
调用函数那段就运行完了(那么tcp的端口就相当于直接关闭了)
苦恼不已 后来按照以上程序在一些地方改了改 加上了 关闭 的操作
通过进程链接来关闭已经在服务的进程(就是一层的监督结构)
这边记点笔记,说说一些API调用之类的
代码如下:
-module(server). -export([start/0,start/1,loop_accept/2,listener/1]). -define(DEAFULT_PORT,1236). start() -> start(?DEAFULT_PORT). start(Port) -> spawn_link(?MODULE,listener,[Port]). listener(Port) -> case gen_tcp:listen(Port,[{active,false}]) of {ok,LSocket}-> process_flag(trap_exit,true), spawn_link(?MODULE,loop_accept,[LSocket,self()]), loop(LSocket); Other -> Other end. loop(LSocket) -> receive continue -> spawn_link(?MODULE,loop_accept,[LSocket,self()]), loop(LSocket); {stop,Reason} -> exit(Reason); stop -> exit(shutdown); Other -> io:format("link process exit:~p~n",[Other]), loop(LSocket) end. loop_accept(Ls,Pid) -> io:format("accept now~n"), case gen_tcp:accept(Ls) of {error, Reason} -> Pid ! {stop,Reason}; {ok,Socket} -> Pid ! continue,worker(Socket) end. worker(Socket) -> %%io:format("work now~n"), case gen_tcp:recv(Socket, 0) of {ok, Packet} -> gen_tcp:send(Socket,Packet),worker(Socket); {error, Reason} -> %%io:format("Socket ~w closed [~w]~w",[Socket,self(),Reason]), exit(Reason) end.
代码的基本流程很简单:
- server:start/0或/1启动应用
- 产生并连接进程sub(监督者进程 同时用来监视进行echo的进程的情况)
- sub用来启动监听的进程acc(该进程一启动就会监听 有连接进来给work处理)
- sub接受到退出信息(stop)后就退出并发送shutdown信息 其他的acc进程也跟着退出
代码说明:
listen时使用了active,false的参数 说明所有进来的信息要通过gen_tcp:recv/2才能获取到(而 active,true或者 active,once则会直接把信息传送给进程 区别是后者只传送一次(所以在接受时要通过inet:setopts/2不断重置为{active,once})
此外设置成 active,false 接受的消息要么是{ok,内容} 要么是{error,Reason}
而其他两种收到的形式是 {tcp,S,Data}和 {tcp_closed,S}(那个S就是通信用的Socket)
附带一张 链接时退出信号传播时的对应表现:
捕获状态 退出信号(原因) 动作
true kill 消亡,向链接的进程广播退出信号(killed)
true X 将{'EXIT', Pid, X} 加入到邮箱
false normal 不做任何事
false kill 消亡,向链接的进程广播退出信号(killed)
false X 消亡,向链接的进程广播退出信号X
该表来源:http://www.cnblogs.com/fangjie008/archive/2012/08/28/2660361.html
捕获指的是process_flag(trap_exit,true).
相关推荐
Erlang的设计哲学是创建简单、可扩展、容错的程序,其语法规则相对简单明了,非常适合并行编程和分布式计算。 #### 书籍推荐 《Erlang编程:软件为并发世界而设计》是Joe Armstrong所著的入门级Erlang书籍。作者在...
《Erlang编程》是一本深入探讨Erlang语言的图书,主要面向对并发处理、分布式系统和高可用性有需求的开发者。Erlang是一种为构建大规模并发系统而设计的函数式编程语言,它源自爱立信,以其在电信行业的成功应用而...
“即便我已经使用Erlang多年,在编程的时候仍然需要参考《Erlang编程指南》。不同层次的Erlang程序员都会发现本书是有价值的学习和参考资料..., 《Erlang编程指南》每章末尾都提供了练习题,并且由简单的示例贯穿全书。
本文将对Erlang编程规则的中文翻译版本中的部分内容进行详细解析,包括Erlang术语、SW工程原则、程序、服务器和消息处理、Erlang特殊约定、常见错误以及所需文档约定等。 Erlang术语部分提到了Erlang程序的模块化...
Erlang并发编程,Erlang程序设计,Erlang中文手册。 学习erlang的好资料。 Erlang是一个结构化,动态类型编程语言,内建并行计算支持。最初是由爱立信专门为通信应用设计的,比如控制交换机或者变换协议等,因此...
Erlang程序设计(中文版-完整书签)&Erlang编程指南(中英文版)
Erlang基于函数式编程范式,这意味着程序由纯函数构成,没有副作用。函数式编程强调数据不可变性和函数的数学属性,使代码更易于理解、测试和并行处理。 ### 2. 并发与轻量级进程 Erlang的一大亮点是其内置的并发...
这个压缩包包含了Erlang程序设计的完整目录和源码,是学习和理解Erlang编程的重要资源。 Erlang的并发特性源于其轻量级进程模型,每个进程都有自己的内存空间,进程间通信通过消息传递实现,这种设计降低了并发执行...
【标题】中的“仿知乎java源码-py_interface:Erlang到Python的集成”表明这是一个关于Java编程的项目,其核心功能是实现Erlang与Python之间的交互。Erlang是一种面向并发、分布式计算的语言,常用于构建高可用性和...
Erlang(['ə:læŋ])是一种通用的面向并发的编程语言,它由瑞典电信设备制造商爱立信所辖的CS-Lab开发,目的是创造一种可以应对大规模并发活动的编程语言和运行环境。Erlang问世于1987年,经过十年的发展,于1998年...
你可以开始使用Erlang编程,或者与其他Erlang应用程序(如 RabbitMQ 或 Phoenix 框架)集成。 Erlang的语法简洁而独特,主要基于函数式编程理念。其数据类型包括原子(atom)、整数、浮点数、字符串、列表和二进制...
我自己在新学erlang,在LeetCode OJ上找了题目练习,题目很适合新手熟悉语言,但是LeetCode OJ里面只有几门主流语言的答案,下面是已完成的erlang源代码,后续有空再做其他问题续传,题目包含:(源码开头都有题目...
erlang编程语言圣经 erlang从业人员的必备书籍 erlang语言开发入门
Erlang是一种强大的并发编程语言,特别适合于构建高可用性、分布式系统,尤其是在电信、银行和互联网领域广泛应用。在给定的标题“erlang 24.0 龙芯 loongarch64 预编译版本”中,我们可以看到这个软件包是为龙芯...
这份"Erlang游戏程序学习完整PDF手册"是一份全面介绍Erlang在游戏开发中应用的学习资料,包含了Erlang的基础知识、并发原理以及在游戏开发中的实践案例。 Erlang语言的设计理念源自于Ericsson公司为解决电信系统中...
内容概要:本文档详细介绍了Erlang编程语言及其并行编程模型,并重点阐述了Erlang OTP框架的特性和应用场景。首先,文档简述了Erlang语言的特点,包括轻量级进程、模式匹配和热代码升级等特性,以及它在构建高可用、...
在Erlang编程语言中,进程是其核心特性之一,它们是并发执行的实体,类似于其他语言中的线程。在Erlang中,进程间通信(IPC)是通过消息传递来实现的,而`link`机制是这个通信模型中非常重要的一部分。本教程将通过...
【Erlang程序设计(第2版)】是由Erlang之父Joe Armstrong撰写的一本经典著作,专注于介绍Erlang编程语言在并发、分布式和容错系统中的应用。本书适用于初学者和有一定经验的Erlang程序员。作者在书中讨论了如何利用...