我试图从创建的线程调用 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,因此发送失败。请问有什么想法吗?