2011-08-20 115 views
1

我嘗試從C代碼向erlang發送消息。我使用EI庫。將消息從C傳遞給erlang

我的C代碼:

int main (int argc, char** argv) 
{ 
    erl_init (NULL, 0); 

    extern const char *erl_thisnodename(void); 
    extern short erl_thiscreation(void); 

    #define SELF(fd) erl_mk_pid(erl_thisnodename(), fd, 0, erl_thiscreation()) 

    ETERM *arr[2], *emsg; 

    int sockfd, creation=1; 

    arr[0] = SELF(sockfd); 
    arr[1] = erl_mk_atom("ok"); 
    emsg = erl_mk_tuple(arr, 2); 

    erl_reg_send(sockfd, "my_server", emsg); 
    erl_free_term(emsg); 

    return (EXIT_SUCCESS); 
} 

我的二郎代碼:

start() -> 
    Pid = spawn(?MODULE, loop, []), 
    register(my_server, Pid). 

loop() -> 
    receive 
     {ok} -> 
      io:format("Ok received \n"), 
      loop(); 
     stop -> 
      stop; 
     _ -> 
      io:format("Somethig else \n") 
    end.  

stop() -> 
    my_server ! stop. 

但是當我運行我的C語言應用程序,收到二郎應用罷了。怎麼了?

我得到錯誤:

[線程調試使用libthread_db所啓用]

計劃接收信號SIGSEGV,分割過錯。 0x08055fac in ei_mutex_lock()

謝謝。

+0

你的調試器說什麼?你有沒有堆棧跟蹤? –

回答

3

至少,您的C程序將未初始化的變量(sockfd)傳遞給erl_mk_pid()函數,稍後再調用erl_reg_send()。這可能是一個很好的開始。