免责声明:这个问题的作者有二郎的平均知识和C语言的基础知识
我读的互操作性教程使用手册吧。 我已经成功编译complex.c
例子,并与二郎神端口工作没有任何问题。
不过,我想了解实际的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<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);
}
和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' - 当二郎端口将数据发送到C,所述第一字节确定一个要被调用的函数。 如果字节保持十进制1,则
foo()
被调用时,如果字节保持十进制2,然后bar()
被调用。 如果没有改变,无论如何该协议可以用来向上与每个只有1个参数调用至255不同的C函数。 是对的吗? - “添加长度指示符将由二郎端口自动完成的,但必须在外部的C程序明确地完成”。 那是什么意思? 在这行代码是做什么?
- 从Tutorial:“默认情况下,C程序应该从标准输入(文件描述符0)读取和写入到标准输出(文件描述符1)”。 然后:“请注意,stdin和stdout是缓冲输入/输出,不应该被用于与二郎神的沟通!” 什么是这里的收获?
- 为什么
buf
初始化为[100]