2

Erlang-sqlite3はポートドライバーを使用してSQLiteデータベースに接続し、ポートからメッセージを受信します

wait_result(Port) ->
  receive
    {Port, Reply} ->
      % io:format("Reply: ~p~n", [Reply]),
      Reply;
    {error, Reason} ->
      io:format("Error: ~p~n", [Reason]),
      {error, Reason};
    _Else ->
      io:format("Else: ~p~n", [_Else]),
      _Else
  end.

ポートからのメッセージは次のようになると思いました:

{Port,{data,Data}}    Data is received from the external program.
{Port,closed}         Reply to Port ! {Pid,close}.
{Port,connected}      Reply to Port ! {Pid,{connect,NewPid}}
{'EXIT',Port,Reason}  If the port has terminated for some reason.

したがって、句のio:format行のコメントを解除するときは、実際の応答を確認する必要があります。私はしません; 代わりに私は(のために)見る{Port, Reply}{data, ...}test.erl

Reply: {ok,101}
Reply: [{columns,["name"]},{rows,[{<<"user">>}]}]
Reply: [{columns,["sql"]},
        {rows,[{<<"CREATE TABLE user (id INTEGER PRIMARY KEY, name TEXT, age INTEGER, wage INTEGER)">>}]}]
Reply: {id,1}
Reply: {id,2}
Reply: [{columns,["id","name","age","wage"]},
        {rows,[{1,<<"abby">>,20,2000},{2,<<"marge">>,30,2000}]}]
Reply: [{columns,["id","name","age","wage"]},{rows,[{1,<<"abby">>,20,2000}]}]
Reply: [{columns,["id","name","age","wage"]},
        {rows,[{1,<<"abby">>,20,2000},{2,<<"marge">>,30,2000}]}]
Reply: {ok,101}
Reply: [{columns,["id","name","age","wage"]},{rows,[{1,<<"abby">>,20,2000}]}]
Reply: {ok,101}
  1. どこが間違っているのですか?
  2. ポートエラーで表示されるメッセージは次のようになります{'EXIT',Port,Reason}か?
4

2 に答える 2

0

プロセスとポートの間には、実際のポートメッセージをデコードする別のプロセスが関係しているようです。ポートが本当にポートであると確信していますか?ポートのio:format("Port: ~p~n", [Port])ようなものが表示された場合、中間者がいるようなものが表示された場合は、試してみてください。#Port<0.500><0.38.0>

于 2010-10-21T13:08:26.497 に答える
0

http://www.erlang.org/doc/apps/erts/driver.htmlの関連する例は最後の例です。を使用するdriver_output_termと、用語が単独で送信されることがわかります。

receive
    Result ->
        Result
end.

それ以外の

receive
    {Port, {data, Result}} ->
        Result
end.
于 2010-11-18T14:00:56.390 に答える