erl_nif Erlang的ffi 扩展erlang的另外一种方法
November 26th, 2009
11 comments
原创文章,转载请注明: 转载自系统技术非业余研究
我们知道扩展erl有2种方法, driver和port. 这2个方法效率都低,因为都要经过 port机制,对于简单的模块,这个开销有时候是不可接受的。这时候nif来救助了。今天发布的R13B03已经支持了,虽然是实验性质的。 erl_nif的代表API functions for an Erlang NIF library。 参考文档:
erl_nif.html 和 erlang.html#erlang:load_nif-2 以及 reference_manual/code_loading.html#id2278318 。
我们来用nif写个最简单的hello, 来展现nif的威力和简单性。
不啰嗦,直接上代码:
root@nd-desktop:~/niftest# cat niftest.c
/* niftest.c */ #include "erl_nif.h" static ERL_NIF_TERM hello(ErlNifEnv* env) { return enif_make_string(env, "Hello world!"); } static ErlNifFunc nif_funcs[] = { {"hello", 0, hello} }; ERL_NIF_INIT(niftest,nif_funcs,NULL,NULL,NULL,NULL)
root@nd-desktop:~/niftest# cat niftest.erl
-module(niftest). %-on_load(init/0). -export([init/0, hello/0]). init() -> ok=erlang:load_nif("./niftest", 0), true. hello() -> "NIF library not loaded".
编译:
root@nd-desktop:~/niftest# gcc -fPIC -shared -o niftest.so niftest.c -I /usr/local/lib/erlang/usr/include #你的erl_nif.h路径
运行:
root@nd-desktop:~/niftest# erl Erlang R13B03 (erts-5.7.4) [source][/source] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]</code> Eshell V5.7.4 (abort with ^G) 1> c(niftest). {ok,niftest} 2> niftest:hello(). "NIF library not loaded" 3> niftest:init(). ok 4> niftest:hello(). "Hello world!" 5>
现在重新修改下 niftest.erl 把on_load的注释去掉
root@nd-desktop:~/niftest# erl Erlang R13B03 (erts-5.7.4) [source][/source] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]</code> Eshell V5.7.4 (abort with ^G) 1> c(niftest). {ok,niftest} 2> niftest:hello(). "Hello world!" 3>
综述: nbif很简单,而且高效。
Post Footer automatically generated by wp-posturl plugin for wordpress.
Recent Comments