Erlang-C порт не работает на некоторых машинах Unix - PullRequest
1 голос
/ 03 апреля 2012

Я использую стандартный код порта erlang-c, как описано в учебник http://www.erlang.org/doc/tutorial/c_port.html#id63121 и в Книга Джо Армстронга.

В моем macbook код erlang и c-code успешно общаются, используя 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.

С-код успешно получает закодированное сообщение от erlang код. Затем c-код записывает ответ, используя write_exact (в в этом случае это очень простой ответ OK с двухбайтовым заголовком). Но код erlang никогда не получает это сообщение. Приведенная выше функция цикла никогда не получает {Port, {data, Data}} ...

C-код для написания ответа - это стандартный код (write_cmd и напишите точно). Я не коснулся ни одного из этого стандартного кода:

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 в этом случае на этой машине? (Это работает на MacBooks и раньше работал на той же самой машине pdp - и я не коснулся Erlang код с момента его последней работы). Может ли это быть что-то делать с разрешения или что-то, предотвращая запись в write_exact от на самом деле писать что-нибудь? Я в растерянности.

...