Erlang C связанный с узлом вопрос

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

Существует следующий пример:


/* 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 существует "избранный" оператор, но в API Erlang EI я не знаю, существует ли такой оператор.

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

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

Можно было бы думать, что можно было изменить код как:

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

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

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

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

5
задан ndim 29 December 2009 в 10:49
поделиться

3 ответа

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

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

2
ответ дан 15 December 2019 в 01:03
поделиться

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

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

1
ответ дан 15 December 2019 в 01:03
поделиться

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

1
ответ дан 15 December 2019 в 01:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: