C/C++ 与 Erlang 共享内存

标签 c erlang

假设数组是由 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/

相关文章:

c - 关于 c 数组

c - 宏打印输出

sockets - 将控制权从一个 gen_fsm 传递到另一个

docker - 在用于Docker的Erlang Ephemeral端口选择上设置特定范围

Java Web 应用程序监控和容错

math - 为什么 erlang 重新定义了像余数这样基本的东西?

java - 从 JNI 代码检查 Java 类中是否存在可选字段或方法

c - c中的两个不同的命令行参数

c - 这些C的​​main函数说明了什么?

erlang - 如何控制正在运行的工作进程的数量?