4

Erlang の Port 機能を使用して外部プロセスとして実行している C コードがいくつかあります。を介して C コードを開始するプロセスでopen_port、C コードがクラッシュしたかどうかを検出する必要があります。ドキュメンテーションは私には完全に明確ではありませんが、私が理解しているように、Erlang プロセスと外部コードの間に双方向のリンクが確立されています。一方が死亡すると、もう一方に通知されます。

「Erlang 相互運用性チュートリアル ガイド」( http://www.erlang.org/doc/tutorial/c_port.html )のコードを少し変更したバージョンを次に示します。

init(ExtPrg) ->
    register(cport, self()),
    process_flag(trap_exit, true),
    Port = open_port({spawn, ExtPrg}, [{packet, 2}]),
    PInfo = erlang:port_info(Port),
    io:format("Port: ~p   PInfo: ~p~n", [Port, PInfo]),
    RVal = link(Port),
    io:format("link?  ~p~n", [RVal]),
    loop(Port).

loop(Port) ->
    receive
        {call, Caller, Msg} ->
            Port ! {self(), {command, encode(Msg)}},
            receive
                {Port, {data, Data}} -> 
                    Caller ! {cport, decode(Data)}
            end,
            loop(Port);
        stop ->
            Port ! {self(), close},
            receive
                {Port, closed} -> 
                    exit(normal)
            end;
        {'EXIT', Port, Reason} -> 
            exit(port_terminated)
    end.

呼び出しはinitC コードを正しく実行し、sets を見ることができますが、Unix シェルから使用して C コードを強制終了するとtrap_exitEXTTメッセージは受信されません。kill -HUP呼び出しの有無にかかわらず試してみましたlink(Erlang のドキュメントでは使用されていません)。追加した印刷コードは次を生成します。

Eshell V5.9.1  (abort with ^G)
1> cport:start("./cport 22").
Port: #Port<0.630>   PInfo: [{name,"./cport 22"},
                             {links,[<0.38.0>]},
                             {id,630},
                             {connected,<0.38.0>},
                             {input,0},
                             {output,0}]
<0.38.0>
link?  true

リンクが登録されているように見えますが、トラップをキャッチしていません。私は何が欠けていますか?

4

1 に答える 1

6

open_port()を呼び出すときに、追加のオプションexit_statusを試してください。

私はゲームサーバーを監視するために同様のErlangプログラムを実行しました。外部ゲームサーバーがクラッシュしたとき、中央のErlang監視システムから再起動したかったのです。これは私のために働いたコードでした:

erlang:open_port({spawn_executable, "<Path to my game server start script>"}, 
                 [ exit_status ]),

外部プロセスが強制終了されると、次のタイプのメッセージが表示されます

{Port,{exit_status,Status}}
于 2013-03-05T07:38:35.633 に答える