Erlang C节点相关问题

use*_*855 5 erlang

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网络编程中有"select"语句但在Erlang EI API中我不知道是否有这样的语句.

基本上我想构建一个C节点,它不断向Erlang节点发送消息.为简单起见,假设只有一个Erlang节点.

Erlang节点必须处理它从C节点接收的消息.Erlang节点不应该确保它已经收到消息,而不是必须回复处理结果.因此,一旦发送消息,我不关心它的信仰.

有人可能会认为可以将代码修改为:

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

这将产生一个无限循环,我们在其中生成和使用(发送)消息.但是有一个重要问题:如果我这样做,那么C节点可能会向Erlang节点发送太多消息(因此应该有一种方法将消息从Erlang节点发送到C节点以减慢速度),或者Erlang节点可能认为C节点已关闭.

我知道问题必须是一个简短的套件(这很长很丑),但总结一下:

可以使用什么机制(过程调用,算法)来为Erlang中的懒惰消费者在C中开发一个热切的生成器,这样双方都能够了解底层的上下文?

jld*_*ont 2

我自己使用端口驱动程序来处理您所描述的情况(没有接触 C 节点,因为我宁愿有更多的解耦)。

查看 Erlang 的端口驱动程序库:EPAPI。有一个项目利用了这个库:Erland DBus