2017-02-23 8 views
1

作成したスレッドからenif_sendを呼び出そうとしました。 主に、私はnifから放出された受信メッセージを聞くerlangプロセスを持っています。作成されたスレッドの問題のEnif_send関数

まず、私のenif機能で、その後、私は次のようにメッセージを送信するenif_sendを呼び出して、私は私のErlangのプロセスのpidを持って、私はそれをキャスト:

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と同じpidがチェックされているため、送信に失敗しました。 何かお考えですか?

答えて

2

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を使用してそれを抽出する必要があります。

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

あなたが作成した送信スレッドでの使用のためにそれをコピーしことができます。たとえば、場合には、Erlangの呼び出し側から渡される最初の引数です。

関連する問題