В учебном пособии по адресу:
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, чтобы обе стороны знали о базовом контексте?