2014-03-04 81 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,我認爲這會讓事情變得更加複雜。讓我再試一次。我會讓你知道的。謝謝! –