我正在使用教程http://www.erlang.org/doc/tutorial/c_port.html#id63121和 Joe Armstrong 的书中描述的标准 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 写回响应(在这种情况下,它是一个非常简单的带有两个字节标头的 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 中的写入实际写入任何内容?我很茫然。