1

我正在使用教程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 中的写入实际写入任何内容?我很茫然。

4

0 回答 0