02

Erlang-自定义behaviour

FILED IN Erlang No Comments

-module(my_behaviour).
-export([behaviour_info/1]).
behaviour_info(callbacks) ->
[{handle_1, 5},
{handle_2, 5};

behaviour_info(_Other) ->
undefined.

然后在实现该behaviour的模块里

-module(do_my_behaviour).
-export([handle_1/5, handle_2/5]).
-behaviour(my_behaviour).
handle_1(_, _, _, _, _) -> ok.
handle_2(_, _, _, _, _) -> ok.

同时编译时记得带上 你自己定义的behaviour所在文件夹作为-pa参数,比如 my_behaviour.erl编译后的beam文件放在behaviour目录下,那么
erlc -pa behaviour/ do_mybehaviour.erl

如果不加-pa,会提示Warning: behaviour my_behaviour undefined

25

Erlang SASL – error_logger event handlers

FILED IN Erlang 2 Comments

SASL定义了如下几个error logger event handlers

sasl_report_tty_h

输出supervisor报告、崩溃报告、系统进度情况报告到标准输入输出

sasl_report_file_h

输出supervisor报告、崩溃报告、系统进度情况报告到单独的文件

error_logger_mf_h

输出所有发送到error_logger进程的日志消息到硬盘。在error_logger进程中包含对log_mf_h的调用

25

Erlang SASL – overload

FILED IN Erlang No Comments

overload用来间接的调整系统CPU的使用。当一个application准备启动时,它会先调用 overload:request/0 如果返回 accept 则表示app可以启动,如果返回 reject 则表示拒绝
猛击…还有更多…

25

Erlang SASL – alarm_handler

FILED IN Erlang 2 Comments

2. alarm_handler

alarm handler 进程是一个用gen_event实现的事件处理进程,用来接收系统运行时发出的警告,erlang并不希望通过这个进程来处理所有的警告,相反,erlang鼓励用户实现自己的 alarm handler。在没有指定处理进程的情况下,erlang启动了一个简单的处理进程来处理系统警告。这个简单的处理进程,会将收到的所有警告信息,发送给error logger。这个简单的处理进程被注册为”alarm_handler”,如果你要更换为自己的处理模块,可以这样:

gen_event:swap_handler(alarm_handler, {alarm_handler, swap}, {NewHandler, Args}).

解释:gen_event:swap_handler(alarm_handler, {当前的处理进程名, 退出的原因(会被该gen_event的terminate接受)}, {仅的处理进程名, 新处理进程接受的参数}).

调用这个函数时,erlang将尝试去调用

NewHandler:init({Args,  PreHandlerTerminateReturn).

第二个参数是:上一个处理进程terminate时返回的数据

下面是我写的一个例子,这个例子只适合第一次切换alarm handler,第二次时,init参数应该是 {Args, {ok, terminate_0}}即根据上一次terminate的结果

-module(alarm).
-export([init/1]).
-export([handle_call/2,
handle_info/2,
handle_event/2,
terminate/2,
code_change/3]).

-behaviour(gen_event).

init({Args, {alarm_handler, Alarms}}) ->
io:format("~w ~w ~n", [Args, Alarms]),
{ok, ok}.

handle_call(Info, State) ->
io:format("~w ~n", [Info]),
{ok, State}.

handle_info(Info, State) ->
io:format("~w ~n", [Info]),
{ok, State}.

handle_event(Info, State) ->
io:format("~w ~n", [Info]),
{ok, State}.

terminate(Reason, _State) ->
io:format("terminate:~w ~n", [Reason]),
{ok, terminate_0}.

code_change(_, State, _) ->
{ok, State}.

24

Erlang SASL

FILED IN Erlang 2 Comments

英文全称:System Architecture Support Libraries

中文对照:系统架构支持库

architecture ['ɑ:kitektʃə] 架构

介绍:

erlang sasl 提供下面几个服务(点击各个连接查看详细介绍)

  1. error_logger event handlers
  2. alarm_handler
  3. overload
  4. rb
  5. release_handler
  6. systools

启动sasl的方式是在启动erlang的shell时加上 -boot start_sasl参数,如

erl -boot start_sasl

, ,

20

Erlang远程连接其他节点的shell

FILED IN Erlang No Comments

[root@ming2_local_dev logs]# erl -setcookie 123456 -name 'shell@192.168.1.86'

Erlang R13B04 (erts-5.7.5) [source] [64-bit] [rq:1]
[async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.7.5  (abort with ^G)
(shell@192.168.1.86)1>
User switch command
--> r 'test@192.168.1.86'
--> j
1  {shell,start,[init]}
2* {'test@192.168.1.86',shell,start,[]}
--> c 2
Eshell V5.7.5  (abort with ^G)
(test@192.168.1.86)1>

解释:

erl -setcookie 123456 -name ’shell@192.168.1.86′

在本地启动一个节点,cookie设置为与你想要连接的远程节点相同, 注意 -name ’shell@192.168.1.86′ 务必别忘了,否则可以连接却无法操作远程shell

启动本地节点后  Ctrl + G

输入 h 查看帮助

输入 r 远程节点名 连接远程节点

连接成功后,输入 j 查看所有连接的节点及它的代号(就是前面的那个数字)

然后  输入 c 远程节点代号,开始操控远程节点

, ,

08

Erlang的一些限制

FILED IN Erlang No Comments

转自:http://cryolite.javaeye.com/blog/241516
1. 进程的数量
缺省情况下同时存在的最大Erlang进程数量不超过2^15=32768个,这个限制可以放宽至2^28=268435456个(具体查阅系统标志+P ),由于内存的限制在32位环境中这个数量不太可能达到。

2. atom最多能有多少个字符
255个

3. 最多能有多少atom(atom的最大数量)
2^20=1048576

4. 分布式节点的数量
分两种情况:
1) 有名字的节点,其多少取决于atom的最大数量;
2)连接节点:系统内能同时连接上的最大节点数取决于能同时连接的所有有名字的节点数和可用的port,或者可用的socket数
猛击…还有更多…

TOP