Я использую стандартный код порта 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 от
на самом деле писать что-нибудь? Я в растерянности.