Erlang-C端口无法在某些unix机器上运行

时间:2012-04-03 12:34:34

标签: erlang erlang-ports

我正在使用标准的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 实际上写什么?我很茫然。

0 个答案:

没有答案