チュートリアル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への書き込みが実際に何かを書き込むのを妨げる、アクセス許可などと関係があるのでしょうか。私は途方に暮れています。