将消息从 C 传递到 erlang

发布于 2024-11-30 14:15:14 字数 1085 浏览 2 评论 0原文

我尝试将消息从 C 代码发送到 erlang。我用EI库。

我的 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);
}

和我的 erlang 代码:

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 应用程序时,erlang 应用程序没有收到任何消息。怎么了?

我收到错误:

[启用使用 libthread_db 进行线程调试]

程序收到信号 SIGSEGV,分段错误。 ei_mutex_lock() 中的0x08055fac

谢谢。

I try to send message from C code to erlang. I use EI Library.

My C code:

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);
}

And my erlang code:

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.

But when i run my C application, erlang application nothing received. What's wrong?

I get error:

[Thread debugging using libthread_db enabled]

Program received signal SIGSEGV, Segmentation fault.
0x08055fac in ei_mutex_lock ()

Thank you.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

始终不够 2024-12-07 14:15:14

至少,您的 C 程序将未初始化的变量 (sockfd) 传递给 erl_mk_pid() 函数,并在稍后调用 erl_reg_send()< /代码>。这可能是一个很好的起点。

At the very least, your C program passes an uninitialized variable (sockfd) to the erl_mk_pid() function, and again later in the call to erl_reg_send(). That's probably a good place to start.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文