1

私は Erlang の初心者で、「Learn You Some Erlang For Great Good!」に取り組んできました。批評家がパラメーターを持つこのコード例の修正版を使用します。

critic(Count) ->
    receive
        {From, {"Rage Against the Turing Machine", "Unit Testify"}} ->
            From ! {self(), {"They are great!", Count}};
        {From, {"System of a Downtime", "Memoize"}} ->
            From ! {self(), {"They're not Johnny Crash but they're good.", Count}};
        {From, {"Johnny Crash", "The Token Ring of Fire"}} ->
                From ! {self(), {"Simply incredible.", Count}};
        {From, {_Band, _Album}} ->
            From ! {self(), {"They are terrible!", Count}}
    end,
    critic(Count).

次のように生成されます。

restarter() ->
    process_flag(trap_exit, true),
    Pid = spawn_link(?MODULE, critic, [my_atom]),
        register(critic, Pid),
    receive
        {'EXIT', Pid, normal} -> % not a crash
                ok;
        {'EXIT', Pid, shutdown} -> % manual termination, not a crash
            ok;
        {'EXIT', Pid, _} ->
            restarter()
    end.

モジュールは次のように使用されます。

1> c(linkmon).                      
{ok,linkmon}
2> Monitor = linkmon:start_critic().
<0.163.0>
3> linkmon:judge("Rage Against the Turing Machine", "Unit Testify").
{"They are great!",my_atom}

ここで、「my_atom」を単純な数字 (255 など) に変更すると、モニターがクラッシュします。

1> c(linkmon).                                                      
{ok,linkmon}
2> Monitor = linkmon:start_critic().                                

=ERROR REPORT==== 14-Jul-2013::20:42:20 ===
Error in process <0.173.0> with exit value: {badarg,[{erlang,register,[critic,<0.174.0>] []},{linkmon,restarter,0,[{file,"linkmon.erl"},{line,16}]}]}

ただし、[1] を送信すると機能します (したがって、コードは "spawn(....., [[255]])" です)。単一の数値を渡すことができないのはなぜですか? spawn/3 のドキュメントをざっと読んだだけでは、実際には何もわかりません...何かを見逃していて、数値が Erlang の用語ではないことを除けば。しかし、どうすれば数値を渡すことができますか?

4

1 に答える 1

4

エラー メッセージは、16 行目の register(critic, Pid) の呼び出しが、引数が正常に見えても「badarg」が原因でクラッシュすることを示しています。これは、Pid によって参照されるプロセスが既に停止している場合 (間違った数の引数を渡した場合など、すぐにクラッシュする場合)、またはその名前を使用するプロセスが既に存在する場合に発生する可能性があります。spawn(Mod,Fun,[...]) のリストの長さが critical() 関数の引数の数と一致することを確認し、シェルで「whereis(critic)」を呼び出して古いファイルがあるかどうかを確認します。名前の再利用をブロックするプロセス。

于 2013-07-14T19:25:56.983 に答える