C и Erlang :Пример порта Erlang

Отказ от ответственности :Автор вопроса имеет среднее знание Erlang и базовые знания C.

Я читаю Учебное руководство по взаимодействию в настоящее время. Я успешно скомпилировал пример complex.c, и он без проблем работает с портом Erlang.

Тем не менее, я хотел бы понять, как работает реальный код C. Я так понимаю вообще :в примере читает 2 байта со стандартного ввода и проверяет первый байт. В зависимости от первого байта вызывается функция fooили bar. Это предел моего понимания этого сейчас.

Итак, если взять и erl_comm.c:

/* erl_comm.c */

typedef unsigned char byte;

read_cmd(byte *buf)
{
  int len;

  if (read_exact(buf, 2) != 2)
    return(-1);
  len = (buf[0] << 8) | buf[1];
  return read_exact(buf, len);
}

write_cmd(byte *buf, int len)
{
  byte li;

  li = (len >> 8) & 0xff;
  write_exact(&li, 1);

  li = len & 0xff;
  write_exact(&li, 1);

  return write_exact(buf, len);
}

read_exact(byte *buf, int len)
{
  int i, got=0;

  do {
    if ((i = read(0, buf+got, len-got)) <= 0)
      return(i);
    got += i;
  } while (got

, и port.c:

/* port.c */

typedef unsigned char byte;

int main() {
  int fn, arg, res;
  byte buf[100];

  while (read_cmd(buf) > 0) {
    fn = buf[0];
    arg = buf[1];

    if (fn == 1) {
      res = foo(arg);
    } else if (fn == 2) {
      res = bar(arg);
    }

    buf[0] = res;
    write_cmd(buf, 1);
  }
}

, что на самом деле делает каждая функция? Какой цели на самом деле служат переменные li, len, i, wrote, got?

Еще несколько мелких вопросов:

  1. Почему у функций нет возвращаемых типов, даже voids?
  2. Когда порт Erlang отправляет данные на C, первый байт определяет вызываемую функцию. Если байт содержит десятичную 1, то вызывается foo(), если байт содержит десятичную 2, то вызывается bar(). Если ничего не изменить, этот протокол можно использовать для вызова до 255 различных функций C только с одним параметром в каждой. Это правильно?
  3. «Добавление индикатора длины будет выполняться портом Erlang автоматически, но это должно быть сделано явным образом во внешней программе на C». Что это обозначает? В какой строке кода это делается?
  4. Из учебника :«По умолчанию программа C должна читать из стандартного ввода (файловый дескриптор 0 )и записывать в стандартный вывод (файловый дескриптор 1 ). Затем :"Обратите внимание, что stdin и stdout предназначены для буферизованного ввода/вывода и не должны использоваться для связи с Erlang!" В чем тут подвох?
  5. почему bufинициализируется как [100]?

8
задан skanatek 7 May 2012 в 20:06
поделиться