Erlang 可以和多种程序语言连接,比如 C 语言 java 语言等。一般来讲,A 语言有两种方
式可以调用 B 语言设计的程序。第一种,把 B 语言的可执行二进制代码拷贝到 A 程序中,
定义标准的参数调用接口,从而,B 程序执行的结果返回到 A 程序中。第二种,两个独立
的进程,A 进程可以和 B 进程通信。在 Erlang 中,采用的是第二种方法,本文中,我们就
讲解 Erlang 和 C 语言的接口。
首先要弄清楚,和 C 语言交互数据的方法之一是采用“标准输入输出”,比如你可以通
过控制台(Dos)给 C 程序输入一个值,并再回显。Erlang 虚拟机的底层驱动实现了代替“标
准输入输出”的功能,这就是 Erlang 和 C 程序传递数据的底层原理。你可能想知道,底层
是如何实现这个的呢?这与 Windows 操作系统以及驱动有关系,我们暂时先不用管它。
好了,我们先来写一个 C 程序,代码如下:
#include "stdafx.h"
#include <io.h>
int _tmain(int argc, _TCHAR* argv[])
{
int fn, arg1, arg2, result;
char buff[100];
int len;
while((len = _read(0, buff, 4)) > 0){
arg1 = buff[2];
arg2 = buff[3];
result = arg1 + arg2;
buff[0] = 0;
buff[1]=1;
buff[2] = result;
_write(1, buff, 3);
}
}
逐个来看吧。stdafx.h 包含了 windows 的一些函数库,叫做 Afx 函数库,定义了很多函
数,包括 _tmain()函数,传统的 C 语言使用的是 main()函数。
io.h 文件包含了从一个标准输入输出设备上读取数据的函数,包括 _read, _write 函数。
大家可以在 MSDN 上查一下_read 和_wirte 函数的定义,这里你只需要知道,_read 的第一
个参数的含义:当第一个参数为 0 时,意味着输入,为 1 时表示输出,其它两个参数一个缓
冲区指针,另一个是字节长度。
你可以编译并运行一下,然后单步跟踪一下,运行时,会弹出一个控制台,要你输入一
段字符,然后,它再回显 3 个字符。你可以输入 1234 然后回车,试一下,再单步跟踪一下
看看,相信这段代码的逻辑你肯定能明白,可问题是为什么要用这样一个古怪的 C 程序进
行学习呢?好,现在我就来解释。
Erlang 把和所有外部程序(比如 C 程序)交互数据的方法交给 Port 去完成,因此,当你
的 Erlang 代码想调用外部的 C 程序时,首先需要创建一个端口。Erlang 提供了创建端口的
函数:
评论5