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.
呼び出しはinit
C コードを正しく実行し、sets を見ることができますが、Unix シェルから使用して C コードを強制終了するとtrap_exit
、EXTT
メッセージは受信されません。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
リンクが登録されているように見えますが、トラップをキャッチしていません。私は何が欠けていますか?