Native Implemented Functions(NIF)可以用C来实现程序一些功能的扩展,一般用来实现一些用Erlang无法实现或者实现效率低的功能。
C语言编译生成的动态库(*.so)在Erlang调用C模块时动态加载到Erlang的进程空间中,调用NIF不用上下文的切换开销,但是安全性不是很高,因为NIF的crash会导致整个Erlang进程crash。
NIF的实现
先按官方文档上给的例子,初次实现一下NIF的使用:
1.创建niftest.c文件
#include "erl_nif.h"
static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
return enif_make_string(env, "Hello world!", ERL_NIF_LATIN1);
}
static ErlNifFunc nif_funcs[] =
{
{"hello", 0, hello}
};
ERL_NIF_INIT(niftest,nif_funcs,NULL,NULL,NULL,NULL)
初始化NIF库:
通过初始化宏将C实现和对应的Erlang模块绑定起来;ERL_NIF_INIT(niftest,nif_funcs,NULL,NULL,NULL,NULL)
第一个参数 : 对应erlang模块的名称
第二个参数 : 是该库中所有可供外部调用的NIF的函数描述符的静态数组
函数描述符用数据结构ErlNifFunc来表示:
typedef struct
{
con