作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一些 C 代码,我使用 Erlang 的 Port 功能将它们作为外部进程执行。我想要启动 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
call 正确执行 C 代码,如您所见,集
trap_exit
,但
EXTT
当我使用
kill -HUP
杀死 C 代码时未收到消息来自 Unix shell。我试过使用和不使用
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
最佳答案
在调用 open_port() 时尝试额外的选项 exit_status。
我做了一个类似的 Erlang 程序来监督游戏服务器。
当外部游戏服务器崩溃时,我想从我的中央 Erlang 监控系统重新启动它。
这是对我有用的代码:
erlang:open_port({spawn_executable, "<Path to my game server start script>"},
[ exit_status ]),
{Port,{exit_status,Status}}
关于erlang - Erlang 的 open_port 调用是否链接到结果进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15195300/
我正在开发一个 voip 调用应用程序。我需要做的是在接到来电时将 Activity 带到前台。我在应用程序中使用 Twilio,并在收到推送消息时开始调用。 问题是我试图在接到任何电话时显示 Act
我是一名优秀的程序员,十分优秀!