我正在使用标准的erlang-c端口代码,如下所述 教程http://www.erlang.org/doc/tutorial/c_port.html#id63121和 乔阿姆斯特朗的书。
在我的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(in。)写回响应 这种情况下,它是一个非常简单的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-side,write()函数被调用 - 但不知何故 erlang端永远不会从端口收回消息。
你们知道有什么想法可能导致这条消息 在这种情况下,在这种情况下无法从c回到erlang? (它适用于macbooks和 曾经在同一台pdp机器上工作 - 而且我没有触及过 自上次工作以来的erlang代码)。可能与之有关 权限或某些东西,阻止写入write_exact 实际上写什么?我很茫然。