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
поделиться