Erlang C узел, связанный вопрос - PullRequest
5 голосов
/ 23 декабря 2009

В учебном пособии по адресу: http://www.erlang.org/doc/tutorial/cnode.html

Есть следующий пример:

<code>
/* cnode_s.c */
#include 
#include 
#include 
#include 
#include "erl_interface.h"
#include "ei.h"
#define BUFSIZE 1000
int main(int argc, char **argv) {
  int port;                                /* Listen port number */
  int listen;                              /* Listen socket */
  int fd;                                  /* fd to Erlang node */
  ErlConnect conn;                         /* Connection data */
  int loop = 1;                            /* Loop flag */
  int got;                                 /* Result of receive */
  unsigned char buf[BUFSIZE];              /* Buffer for incoming message */
  ErlMessage emsg;                         /* Incoming message */
  ETERM *fromp, *tuplep, *fnp, *argp, *resp;
  int res;
  port = atoi(argv[1]);
  erl_init(NULL, 0);
  if (erl_connect_init(1, "secretcookie", 0) == -1)
    erl_err_quit("erl_connect_init");
  /* Make a listen socket */
  if ((listen = my_listen(port)) 

Я подозреваю, что erl_receive_msg - это блокирующий вызов, и я не знаю, как это преодолеть. В сетевом программировании на C есть оператор «select», но в API Erlang EI я не знаю, существует ли такой оператор.

По сути, я хочу создать узел C, который будет непрерывно отправлять сообщения узлам Erlang. Для простоты предположим, что существует только один узел Эрланга.

Узел Erlang должен обрабатывать сообщения, которые он получает от узла C. Узел Erlang не должен гарантировать, что он получил сообщение, и ему не нужно отвечать с результатом обработки. Поэтому, как только сообщение отправлено, мне все равно, вера.

Можно подумать, что можно изменить код следующим образом:

...
if (emsg.type == ERL_REG_SEND) {
    ...
    while(1) { 
        //generate tuple
        erl_send(fd, fromp, tuple);
        //free alloc resources
    }
    ...
}
</code>

Это создаст бесконечный цикл, в котором мы создаем и потребляем (отправляем) сообщения. Но есть важная проблема: если я сделаю это, то узел C может отправить слишком много сообщений узлу Erlang (поэтому должен быть способ отправить сообщение от узла Erlang узлу C для замедления), или узел Erlang может подумать, что узел C не работает.

Я знаю, что вопросы должны быть короткими, наборы (это длинные и некрасивые), но подытоживая:

Какой механизм (вызов процедуры, алгоритм) можно использовать для разработки нетерпеливого производителя в C для ленивого потребителя в Erlang, чтобы обе стороны знали о базовом контексте?

Ответы [ 3 ]

2 голосов
/ 23 декабря 2009

Я сам использую драйверы портов для описываемого вами случая (не затрагивал узлы C, потому что я бы предпочел большую развязку).

Посмотрите библиотеку драйвера порта для Erlang: EPAPI . Есть проект, который использует эту библиотеку: Erland DBus .

1 голос
/ 24 марта 2010

вам нужно внимательнее взглянуть на ссылку учебника, которую вы разместили. (ищите «И, наконец, у нас есть код для клиента узла C».) Вы увидите, что автор предоставил реализацию клиентского узла. Это выглядит рационально.

1 голос
/ 23 декабря 2009

Вы проверяли функцию ei_receive_msg_tmo ? Я полагаю, что он работает аналогично получению после построения Erlang, поэтому, если вы установите тайм-аут на 0, он будет неблокирующим.

Я считаю, что erl_interface устарел, и вместо него следует использовать ei. Это может быть полная дезинформация, хотя ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...