假设数组是由 Erlang 程序创建和初始化的,我如何在 Erlang 和外部 C/C++ 程序之间传递数组? (我不想复制整个数组)?
P.S: 我需要 C/C++ 和 Erlang 之间的共享内存环境
最佳答案
如果您所说的“数组”是指您的 C/C++ 可以作为数组轻松访问的内容,那么您将需要使用 Erlang 二进制文件。这些很容易用写成 NIF 的 C/C++ 代码处理。或 driver .例如,给定一个以二进制作为参数的 Erlang 函数,您可以在 C 中将其实现为 NIF,如下所示:
#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 函数将像这样实现:
-module(nif).
-export([binfunc/1]).
-on_load(init/0).
init() ->
erlang:load_nif("./nif", 0).
binfunc(_Bin) ->
{error, "nif not loaded"}.
运行它看起来像这样:
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您可以轻松实现可在 Erlang 和 C/C++ 之间交换的结构、数组等。
关于C/C++ 与 Erlang 共享内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22181648/