C i Erlang: przykład portu Erlang

Zastrzeżenie: Autor pytania ma średnią wiedzę na temat Erlang i podstawową wiedzę o C.

CzytamPodręcznik użytkownika Interoperability Tutorial teraz. Z powodzeniem skompilowałemcomplex.c przykład i działa z Portem Erlang bez żadnych problemów.

Chciałbym jednak zrozumieć, jak działa rzeczywisty kod C. Rozumiem to ogólnie: w przykładzie odczytuje 2 bajty ze standardowego wejścia i sprawdza pierwszy bajt. W zależności od pierwszego bajtu, który wywołujefoo lubbar funkcjonować. To jest granica mojego rozumienia tego teraz.

Więc jeśli weźmiemy obieerl_comm.c:

<code>/* 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<len);

  return(len);
}

write_exact(byte *buf, int len)
{
  int i, wrote = 0;

  do {
    if ((i = write(1, buf+wrote, len-wrote)) <= 0)
      return (i);
    wrote += i;
  } while (wrote<len);

  return (len);
}
</code>

iport.c:

<code>/* 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);
  }
}
</code>

Co właściwie robi każda funkcja? Jaki jest celli, len, i, wrote, got zmienne rzeczywiście służą?

Kilka drobniejszych pytań:

Dlaczego funkcje nie mają nawet typów zwrotówvoids?Gdy port Erlang wysyła dane do C, pierwszy bajt określa funkcję, która ma zostać wywołana. Jeśli bajt zawiera liczbę dziesiętną 1, tofoo() jest wywoływany, jeśli bajt zawiera liczbę dziesiętną 2bar() jest nazywany. Jeśli nie zostanie zmieniony, protokół ten może zostać użyty do wywołania do 255 różnych funkcji C, z których każdy ma tylko 1 parametr. Czy to prawda?„Dodanie wskaźnika długości będzie wykonywane automatycznie przez port Erlang, ale musi być wykonane jawnie w zewnętrznym programie C”. Co to znaczy? W jakim wierszu kodu jest to zrobione?Z samouczka: „Domyślnie program C powinien czytać ze standardowego wejścia (deskryptor pliku 0) i zapisywać na standardowe wyjście (deskryptor pliku 1).” Następnie: „Zauważ, że stdin i stdout są przeznaczone do buforowania wejścia / wyjścia i nie powinny być używane do komunikacji z Erlangiem!” Co to za haczyk?czemubuf jest zainicjowany do[100]?

questionAnswers(1)

yourAnswerToTheQuestion