C y Erlang: ejemplo del puerto de Erlang

Descargo de responsabilidad: El autor de la pregunta tiene un conocimiento promedio de Erlang y un conocimiento básico de C.

Estoy leyendo elTutorial de interoperabilidad Guía del usuario ahora. He compilado con éxito elcomplex.c Ejemplo y funciona con el puerto de Erlang sin ningún problema.

Sin embargo, me gustaría entender cómo funciona el código C real. Lo entiendo en general: en el ejemplo lee 2 bytes de la entrada estándar y comprueba el primer byte. Dependiendo del primer byte se llamafoo obar función. Este es el límite de mi comprensión de esto ahora mismo.

Entonces, si tomamos amboserl_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>

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

¿Qué hace realmente cada función allí? Que propósito tieneli, len, i, wrote, got variables realmente sirven?

Algunas preguntas más pequeñas:

¿Por qué las funciones no tienen ningún tipo de retorno, inclusovoids?Cuando el puerto de Erlang envía datos a C, el primer byte determina la función a llamar. Si el byte contiene el decimal 1, entoncesfoo() se llama, si el byte contiene el decimal 2, entoncesbar() se llama. Si no se cambia, este protocolo se puede usar para llamar hasta 255 funciones C diferentes con solo 1 parámetro cada una. ¿Está bien?"Agregar el indicador de longitud se hará automáticamente por el puerto de Erlang, pero debe hacerse explícitamente en el programa C externo". Qué significa eso? ¿En qué línea de código se hace?En el Tutorial: "De manera predeterminada, el programa C debería leer de la entrada estándar (descriptor de archivo 0) y escribir en la salida estándar (descriptor de archivo 1)". Luego: "¡Tenga en cuenta que stdin y stdout son para entrada / salida con búfer y no deben usarse para la comunicación con Erlang!" ¿Cuál es la trampa aquí?por québuf se inicializa a[100]?

Respuestas a la pregunta(1)

Su respuesta a la pregunta