1

チュートリアルhttp://www.erlang.org/doc/tutorial/c_port.html#id63121およびJoeArmstrongの本で説明されているように、標準のerlang-cポートコードを使用しています。

私のMacBookでは、erlangコードとcコードはwrite_exactとread_exactを使用して正常に通信します。(私はその標準コードのいずれにも触れていません)。

しかし、UNIX pdpマシンでまったく同じコードを実行すると、cからerlangへの通信が切断されます。具体的には、サーバーのループでは次のようになります。

loop(Port) ->
    receive
        {call, Caller, Msg} ->
           Port ! {self(), {command, encode(Msg)}},
           receive
               {Port, {data, Data}} ->  <---- WE NEVER GET HERE !!!
                   Caller ! {complex, decode(Data)}
           end,
           loop(Port);
       stop ->
           Port ! {self(), close},
           receive
               {Port, closed} ->
                   exit(normal)
           end;
       {'EXIT', Port, Reason} ->
           exit(port_terminated)
   end.

cコードはerlangコードからエンコードされたメッセージを正常に受信します。次に、cコードはwrite_exactを使用して応答を書き戻します(この場合、2バイトのヘッダーを持つ非常に単純なOK応答)。しかし、erlangコードがこのメッセージを受け取ることはありません。上記のループ関数は、{Port、{data、Data}}..を受信しません。

応答を書き込むためのcコードは、標準コード(write_cmdおよびwrite_exact)です。私はこの標準コードのいずれにも触れていません:

int write_exact(byte* buff, int len)
{
   assert(len < BUFF_SIZE);
   int i, wrote = 0;
   do
   {
       if ((i = (int)write(1, buff+wrote, len-wrote)) <= 0)
       {
           return (i);
       }
       wrote += i;
   } while (wrote < len);
   return len;
}

c側をデバッグすると、write()関数が呼び出されますが、どういうわけか、erlang側はポートからメッセージを受信しません。

このマシンでこのメッセージがcからerlangに戻らない原因が何か考えがあることをご存知ですか?(これはMacBookで動作し、まったく同じpdpマシンで動作していました。最後に動作してからerlangコードには触れていません)。write_exactへの書き込みが実際に何かを書き込むのを妨げる、アクセス許可などと関係があるのでしょうか。私は途方に暮れています。

4

0 に答える 0