读书人

erlang 通过nif调用C 程序 (erlang调

发布时间: 2012-10-30 16:13:36 作者: rapoo

erlang 通过nif调用C 程序 (erlang调用C程序的问题)

1、

erlang调用C程序的问题,
我采用的是nif方式
代码片段:
char *y;
if (!enif_get_string(env, argv[0], y, sizeof(y), ERL_NIF_LATIN1))
我采用上面方法得到y是“123”,实际erlang传入的参数"123456"
如果我把sizeof(y) 修改成 10在erlang下会出现Segmentation fault错误提示,请问 为什么

我的提问: (不确定以下英文是否完全正确)

hi,

I using nif mehod to Invoke C funtion in Erlang.
come code:
1,char *y;
if (!enif_get_string(env, argv[0], y,?sizeof(y), ERL_NIF_LATIN1))???
I input "123456" args, but only return "123".
2,char *y;if (!enif_get_string(env, argv[0], y,?10, ERL_NIF_LATIN1))?
this only appear Segmentation fault
I have no idea.Please help me.?
Thanks.From jason.

网友的回复

"char *y" is actually just a pointer, so sizeof(y) returns 4, which is
a size of the pointer. Since you don't know how long is the string,
you should prepare a big enough buffer to receive it. So try the
following code:

#define MAXBUFLEN ? ? ? 1024

char y[MAXBUFLEN];
if (enif_get_string(env, argv[0], y, MAXBUFLEN, ERL_NIF_LATIN1) < 1)
? ?return enif_make_badarg(env);

?

// 1 #include "erl_nif.h" 2 #include "unistd.h" 3 #include "stdio.h" 4 #include <string.h> 38 static ERL_NIF_TERM get_name_nif(ErlNifEnv* env, int argc, const ERL_NIF_TE RM argv[]) 39 { 56 ErlNifBinary input; 57 if(!enif_inspect_iolist_as_binary(env, argv[0], &input)) { 58 return enif_make_badarg(env); 59 } 60 char *y="yy"; 61 unsigned char* a=input.data; 62 int i=0; 63 //test 64 while(i<input.size){ 65 fprintf(stderr,"a=%i,", a[i]); 66 i++; 67 //fprintf(stderr,"a=%i\n\r", *a); 68 //a++; 69 } 70 fprintf(stderr,"input.size=%i\n\r", input.size); 71 fprintf(stderr,"input.data=%s\n\r", input.data); 72 //return enif_make_string(env, a, ERL_NIF_LATIN1); 73 return enif_make_string_len(env, a, i,ERL_NIF_LATIN1); 74 //---------------------- 102 }134 static ErlNifFunc nif_funcs[] = {138 {"get_name", 1, get_name_nif}140 };141 ERL_NIF_INIT(complex6, nif_funcs, NULL, NULL, NULL, NULL)//
%%  1 -module(complex6).                                                           2 -export([foo/1, bar/1,  3          get_name/2,  4          get_name/1,  5          get_list/1,  6          test_lxw/2]).  7 -on_load(init/0).  8 init() ->  9     ok = erlang:load_nif("./complex6_nif", 0). 16 get_name(_X) -> 17     ok.
编译gcc -o complex6_nif.so -fpic -shared complex.c complex6_nif.c41> c(complex6).{ok,complex6}43> complex6:get_name([1,0,2,0,3,4]).a=1,a=0,a=2,a=0,a=3,a=4,input.size=6[1,0,2,0,3,4]                                                                  44>

?

?

------------问题总算有结果了。。

官方文档:http://www.erlang.org/doc/tutorial/c_port.html

读书人网 >编程

热点推荐