c - 来自创建线程问题的 Enif_send 函数

标签 c erlang erlang-nif erlang-driver

我试图从创建的线程调用 enif_send。 主要是,我有一个 erlang 进程,它监听从我的 nif 发出的接收到的消息。

首先,在我的 enif 函数中,我得到了我的 erlang 进程的 pid 并对其进行了转换,然后我调用 enif_send 发送一条消息,如下所示:

ErlNifPid* pid = (ErlNifPid*) enif_alloc(sizeof(ErlNifPid));
ErlNifPid * erlang_pid = (ErlNifPid*)argv;
ERL_NIF_TERM pid1 = enif_make_pid(env , erlang_pid);

if(enif_is_pid(env,pid1))
printf(" it's pid\n");
else
printf(" it's not pid\n");

msg_env = enif_alloc_env();
ERL_NIF_TERM replay = (ERL_NIF_TERM) *text;
msg = enif_make_tuple(msg_env, replay);
if(enif_send(NULL, erlang_pid, msg_env,msg))
printf("  send succeed\n");
else
printf(" send failed\n");

直到这个阶段,我才能向我的 erlang 进程发送消息。

之后我生成了一个 enif_thread 并将 env 和 pid 作为参数传递给它,我尝试从我的线程调用 enif_send,例如:

ERL_NIF_TERM pid1 = enif_make_pid(conn->env , conn->pid);
if(enif_is_pid(conn->env,pid1))
printf("it's pid\n");
else
printf(" it's not pid\n");
for (int i=0;i<index;i++)
{
msg_env = enif_alloc_env();

msg = enif_make_int(msg_env, 1); 
 if(enif_send(conn->env, conn->pid, msg_env,msg))
printf("  send succeed\n");
else
printf(" send failed\n");

但是当我用 enif_is_pid 检查 pid 时,我得到了一个无效的 pid,即使它是在生成线程的函数中检查的相同 pid,因此发送失败。 有什么想法吗?

最佳答案

作为documentation for enif_send指出,当从创建的线程调用该函数时,env 参数应为 NULL

顺便说一句,如果没有看到所有代码就很难判断,但是您显示的这部分代码可能有问题:

ErlNifPid * erlang_pid = (ErlNifPid*)argv;
ERL_NIF_TERM pid1 = enif_make_pid(env, erlang_pid);

如果你想要调用者的 pid,你应该使用 the enif_self function或者如果 pid 作为参数传递给 NIF,您应该使用 enif_get_local_pid 提取它.例如,如果它是从 Erlang 调用者传递的第一个参数:

ErlNifPid pid;
if (!enif_get_local_pid(env, argv[0], &pid))
    return enif_make_badarg(env);

然后您可以复制它以在创建的发送线程中使用。

关于c - 来自创建线程问题的 Enif_send 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42412732/

相关文章:

c - 从 Erlang C NIF 返回指针

c - 在每次调用时创建具有新内存地址的变量的函数

SSL: :certify: ssl_handshake.erl:1507: fatal error :证书过期

c - Erlang NIF 从单个进程在内存中存储结构

erlang - 如何从 Erlang 交互式 shell 中抑制 "PROGRESS REPORT"

crash - Erlang崩溃(必须是ejabberd):为什么以及如何调试日志文件?

c - 使用 free() 时大小为 4 的无效读取

c - 嵌入式 C - 在 switch/case 和 hashtable 之间选择

c - 逻辑操作数的评估