2014-03-04 150 views

回答

2

之间的共享存储环境,如果通过“阵列”你的意思是你的C/C++可以作为一个数组很容易地访问的东西,那么你要使用Erlang二进制。这些很容易以C/C++代码处理,编写为NIFdriver。例如,给定一个Erlang函数采用二进制作为参数,你可以在C作为NIF实现它,如下图所示:

-module(nif). 
-export([binfunc/1]). 
-on_load(init/0). 

init() -> 
    erlang:load_nif("./nif", 0). 

binfunc(_Bin) -> 
    {error, "nif not loaded"}. 

#include <stdio.h> 
#include "erl_nif.h" 

static ERL_NIF_TERM 
binfunc(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) 
{ 
    ErlNifBinary bin; 
    unsigned i; 

    if (argc != 1 || !enif_inspect_binary(env, argv[0], &bin)) 
     return enif_make_badarg(env); 
    printf("received binary of length %zu\r\ndata: ", bin.size); 
    for (i = 0; i < bin.size; ++i) 
     printf("%x ", bin.data[i]); 
    printf("\r\n"); 
    return enif_make_atom(env, "ok"); 
} 

static ErlNifFunc nif_funcs[] = 
{ 
    {"binfunc", 1, binfunc} 
}; 

ERL_NIF_INIT(nif,nif_funcs,NULL,NULL,NULL,NULL) 

Erlang的功能会这样来实现

运行它应该是这样的:

Erlang/OTP 17 [RELEASE CANDIDATE 2] [erts-6.0] [source-f91fbb2] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:10] [hipe] [kernel-poll:false] 

Eshell V6.0 (abort with ^G) 
1> nif:binfunc(<<"abcdef">>). 
received binary of length 6 
data: 61 62 63 64 65 66 
ok 

这实现字符的只是一个简单的数组,但使用Erlang's powerful bit syntax可以方便地实现结构,数组,等等,你可以EXC在Erlang和C/C++之间挂起。

+0

非常感谢@Steve,但这只适用于简单的C程序。我不能将它用于大型项目。我想知道是否有一种在两个完全独立的应用程序之间共享大数据的有效方式。 –

+0

实际上,这种技术适用于远远超出“简单C程序”范围的大型应用程序。但是放在一边,你有没有考虑使用你的应用程序之间共享的内存数据库? –

+0

@Steve,我认为这会让事情变得更加复杂。让我再试一次。我会让你知道的。谢谢! –