2

我正在尝试通知 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 脚本。

我不确定这是最好的方法。我一直在研究使用端口(http://www.erlang.org/doc/reference_manual/ports.html),但我很难理解端口如何/在何处与操作系统交互。

总之,我的两个问题是: 1. 从命令行向 Erlang 进程发送消息的最简单方法是什么?2. erlang 端口在哪里/如何从/向操作系统接收/发送数据?

对此的任何建议将不胜感激。

注意操作系统是windows 7。

4

2 回答 2

2

我假设您想在不阻塞主进程循环的情况下调用 os:cmd。为了实现这一点,您需要从派生的进程中调用 os:command,然后将消息发送回父进程以指示完成。

这是一个例子:

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.
于 2012-10-24T21:48:40.440 回答
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 数据类型(简而言之)。

于 2012-10-24T18:33:18.710 回答