如何从命令行向Erlang进程发送消息?

时间:2012-10-24 16:22:57

标签: matlab command-line operating-system erlang ipc

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

2 个答案:

答案 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数据类型(简言之)。