C und Erlang: Erlang Port Beispiel

Haftungsausschluss: Der Fragesteller hat durchschnittliche Kenntnisse in Erlang und Grundkenntnisse in C.

Ich lese dieBenutzerhandbuch für das Interoperabilitäts-Lernprogramm jetzt. Ich habe die erfolgreich zusammengestelltcomplex.c Beispiel und es funktioniert mit dem Erlang Port ohne Probleme.

Ich würde jedoch gerne verstehen, wie der eigentliche C-Code funktioniert. Ich verstehe es im Allgemeinen: Im Beispiel liest es 2 Bytes von der Standardeingabe und überprüft das erste Byte. Abhängig vom ersten Byte wird entweder aufgerufenfoo oderbar Funktion. Dies ist die Grenze meines gegenwärtigen Verständnisses.

Also, wenn wir beide nehmenerl_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>

undport.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>

Was macht eigentlich jede Funktion dort? Welchen Zweck habenli, len, i, wrote, got Variablen dienen tatsächlich?

Noch ein paar kleine Fragen:

Warum haben die Funktionen auch keine Rückgabetypen?voids?Wenn der Erlang-Port Daten an C sendet, bestimmt das erste Byte eine aufzurufende Funktion. Wenn das Byte die Dezimalzahl 1 enthält, dannfoo() wird aufgerufen, wenn das Byte die Dezimalzahl 2 enthältbar() wird genannt. Wenn es nicht geändert wird, können mit diesem Protokoll bis zu 255 verschiedene C-Funktionen mit jeweils nur 1 Parameter aufgerufen werden. Ist das richtig?Msgstr "Das Hinzufügen des Längenindikators erfolgt automatisch über den Erlang - Port, muss jedoch explizit im externen C - Programm erfolgen". Was bedeutet das? In welcher Codezeile wird es ausgeführt?Aus dem Tutorial: "Standardmäßig sollte das C-Programm von der Standardeingabe (Dateideskriptor 0) lesen und in die Standardausgabe (Dateideskriptor 1) schreiben." Dann: "Beachten Sie, dass stdin und stdout für gepufferte Ein- / Ausgabe sind und nicht für die Kommunikation mit Erlang verwendet werden sollten!" Was ist der Haken hier?Warumbuf wird initialisiert zu[100]?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage