2

外部プログラム (Matlab スクリプト) が完了したことを Erlang プロセスに通知しようとしています。これを行うためにバッチ ファイルを使用しており、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) の使用を検討していますが、ポートがオペレーティング システムとどのように/どこで対話するかを理解するのに苦労しています。

要約すると、私の 2 つの質問は次のとおりです。 1. コマンド ラインから Erlang プロセスにメッセージを送信する最も簡単な方法は何ですか? 2. erlang ポートはどこで、どのようにオペレーティング システムとの間でデータを送受信しますか?

これに関するアドバイスをいただければ幸いです。

ちなみにOSはwindows7です。

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.

2 つ目は、ports は erlang データ型のエンコード/デコードに関するものです (簡単に言えば)。

于 2012-10-24T18:33:18.710 に答える