Отказ от ответственности :Автор вопроса имеет среднее знание 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
?
Еще несколько мелких вопросов:
void
s?foo()
, если байт содержит десятичную 2, то вызывается bar()
. Если ничего не изменить, этот протокол можно использовать для вызова до 255 различных функций C только с одним параметром в каждой. Это правильно?buf
инициализируется как [100]
?