0

作成したスレッドから enif_send を呼び出そうとしました。主に、nif から送信された受信メッセージをリッスンする erlang プロセスがあります。

まず、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 を取得したため、送信に失敗しました。任意のアイデアをお願いします?

4

1 に答える 1

2

状態のドキュメントenif_sendenvとして、パラメーターはNULL、関数が作成されたスレッドから呼び出されたときである必要があります。

ところで、すべてのコードを見ないとわかりにくいですが、表示するコードのこの部分に問題がある可能性があります。

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

呼び出し元の pid が必要な場合は、関数を使用するenif_self、pid が引数として NIF に渡される場合は、 を使用して抽出する必要がありますenif_get_local_pid。たとえば、Erlang 呼び出し元から渡された最初の引数の場合:

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

その後、作成した送信スレッドで使用するためにコピーできます。

于 2017-02-23T22:56:23.883 に答える