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?void
s?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]
?