Erlang-主管和gen_fsm上的异常退出
我有三个模块:Erlang-主管和gen_fsm上的异常退出,erlang,otp,erlang-supervisor,gen-fsm,gen-event,Erlang,Otp,Erlang Supervisor,Gen Fsm,Gen Event,我有三个模块:calculadora,log\u calculadora和supervisor\u calculadoraCalculadora只是一个简单的计算器,它使用gen_fsm进行和、减、乘和除运算,并且supervisor执行supervisor行为。Calculadora运行良好,但当我尝试主管时,主管必须重新启动Calculadora模块,当您进行0/0分区或异常时,它不起作用。为什么? PD:模块log\u calculadora只是将我在calculadora中所做的操作写入
calculadora
,log\u calculadora
和supervisor\u calculadora
Calculadora
只是一个简单的计算器,它使用gen_fsm进行和、减、乘和除运算,并且supervisor执行supervisor行为。Calculadora运行良好,但当我尝试主管时,主管必须重新启动Calculadora
模块,当您进行0/0分区或异常时,它不起作用。为什么?
PD:模块log\u calculadora
只是将我在calculadora
中所做的操作写入log.txt文件中。测试模块是给我异常退出的模块
加尔各拉多拉:
监督人:
测试模块
触发以下事件
prop_calculadora() ->
?FORALL(Cmds, commands(?MODULE),
begin
supervisor_calculadora:start(),
在上面的代码中,我看到每个测试用例都启动了supervisor_calculadora(quickchecl?FORALL为每个Cmd执行块)。它将尝试启动管理器并使用相同的名称再次注册,但失败 您会遇到什么错误?正确:快速检查(calculadora_Supervisiada_statem:prop_calculadora())……**异常退出:关机如果您的主管在测试模块之外工作,您是否尝试过。我没有测试它,但是子规范看起来正确,fsm应该重新启动。错误表明模块calculadora_SupervisorAda_statem崩溃,这并不意味着supervisor+fsm没有完成他们的工作。如果没有关于property_statem行为、property.hrl和quickcheck函数的信息,就很难进一步了。我修复了它。谢谢你的评论。
-module(supervisor_calculadora).
-author("BreixoCF").
-behaviour(supervisor).
%% API
-export([start/0]).
%% Supervisor callbacks
-export([init/1]).
%%%===================================================================
%%% API functions
%%%===================================================================
start() ->
supervisor:start_link({local, ?MODULE}, ?MODULE, []).
%%%===================================================================
%%% Supervisor callbacks
%%%===================================================================
init([]) ->
RestartStrategy = one_for_one,
MaxRestarts = 10,
MaxSecondsBetweenRestarts = 5,
Flags = {RestartStrategy, MaxRestarts, MaxSecondsBetweenRestarts},
Restart = permanent,
Shutdown = 2000,
Type = worker,
Calculadora = {calculadora, {calculadora, on, []},
Restart, Shutdown, Type, [calculadora]},
{ok, {Flags, [Calculadora]}}.
-module(calculadora_supervisada_statem).
-behaviour(proper_statem).
-include_lib("proper/include/proper.hrl").
%% CALLBACKS from proper_statem
-export([initial_state/0, command/1, precondition/2, postcondition/3, next_state/3]).
-export([suma/2, resta/2, producto/2, division/2]).
-export([acumular/1, modo/1]).
initial_state() ->
{suma, 0}.
command(_S) ->
frequency([{25, {call, ?MODULE, acumular, [number()]}},
{20, {call, ?MODULE, modo, [modo()]}}]).
modo() ->
elements([suma, resta, producto, division, unknown]).
next_state({division, _S}, _V, {call, ?MODULE, acumular, [0]}) ->
{suma, 0};
next_state({Op, S}, _V, {call, ?MODULE, acumular, [N]}) ->
{Op, erlang:apply(?MODULE, Op, [S, N])};
next_state({_Op, _S}, _V, {call, ?MODULE, modo, [unknown]}) ->
{suma, 0};
next_state({_Op, S}, _V, {call, ?MODULE, modo, [NewOp]}) ->
{NewOp, S};
next_state(S, _V, {call, _, _, _}) ->
S.
precondition(_S, {call, _, _, _}) ->
true.
postcondition({division, _S}, {call, ?MODULE, acumular, [0]}, {'EXIT',_}) ->
true;
postcondition({Op, S}, {call, ?MODULE, acumular, [N]}, Res) ->
Res == ?MODULE:Op(S, N);
postcondition({_Op, _S}, {call, ?MODULE, modo, [_NewOp]}, _Res) ->
true;
postcondition(_S, {call, _, _, _}, _Res) ->
false.
prop_calculadora() ->
?FORALL(Cmds, commands(?MODULE),
begin
supervisor_calculadora:start(),
{H, S, Res} = run_commands(?MODULE,Cmds),
cleanup(),
?WHENFAIL(io:format("History: ~p\nState: ~p\nRes: ~p\n", [H, S, Res]),
aggregate(command_names(Cmds), Res == ok))
end).
%%--------------------------------------------------------------------
%% Internal wrappers and auxiliary functions
%%--------------------------------------------------------------------
acumular(N) ->
Acc = (catch calculadora:acumular(N)),
timer:sleep(100),
Acc.
modo(O) ->
Acc = (catch calculadora:modo(O)),
timer:sleep(100),
Acc.
cleanup() ->
catch calculadora:off(),
timer:sleep(100).
suma(A, B) ->
A + B.
resta(A, B) ->
A - B.
producto(A, B) ->
A * B.
division(_A, 0) ->
0;
division(A, B) ->
A / B.
proper:quickcheck(calculadora_supervisada_statem:prop_calculadora()).
prop_calculadora() ->
?FORALL(Cmds, commands(?MODULE),
begin
supervisor_calculadora:start(),