我正在尝试通知Erlang进程已完成外部程序(Matlab脚本)。我正在使用批处理文件来执行此操作,并希望输入将通知Erlang完成过程的命令。这是主要代码:
在myerlangprogram.erl:
runmatlab() ->
receive
updatemodel->
os:cmd("matlabscript.bat"),
...
end.
在matlabscript.bat中:
matlab -nosplash -nodesktop -r "addpath('C:/mypath/'); mymatlabscript; %quit;"
%% I would like to notify erlang of completion here....
exit
正如您所看到的,我正在使用'os:cmd'erlang函数来调用我的matlab脚本。
我不确定这是最好的方法。我一直在研究使用ports(http://www.erlang.org/doc/reference_manual/ports.html),但我很难理解端口与操作系统的交互方式/位置。
总之,我的两个问题是: 1.从命令行向Erlang进程发送消息的最简单方法是什么? 2. erlang端口在何处/如何从/向操作系统接收/发送数据?
对此有任何建议都会感激不尽。
N.b。操作系统是Windows 7。
答案 0 :(得分:2)
我假设您想要在不阻止主进程循环的情况下调用os:cmd。为了实现这一点,您需要从生成的进程调用os:command,然后将消息发送回Parent进程以指示完成。
以下是一个例子:
runmatlab() ->
receive
updatemodel ->
Parent = self(),
spawn_link(fun() ->
Response = os:cmd("matlabscript.bat"),
Parent ! {updatedmodel, Response}
end),
runmatlab();
{updatedmodel, Response} ->
% do something with response
runmatlab()
end.
答案 1 :(得分:0)
首先,Erlang进程与os进程完全不同。它们之间没有“通知”机制或“消息”机制。你能做的是a)运行新的erlang节点,b)连接到目标节点,c)向远程节点发送消息。
但是。关于你的问题。
runmatlab() ->
receive
updatemodel->
BatOutput = os:cmd("matlabscript.bat"),
%% "here" BAT script has already finished
%% and output can be found in BatOutput variable
...
end.
对于第二种,端口是关于编码/解码erlang数据类型(简言之)。