Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ErlangC节点相关问题_Erlang - Fatal编程技术网

ErlangC节点相关问题

ErlangC节点相关问题,erlang,Erlang,在以下站点提供的教程中: 下面是一个例子: /* 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 */ in

在以下站点提供的教程中:

下面是一个例子:


/* 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))
这将产生一个无限循环,我们在其中生成和使用发送消息。
但是有一个重要的问题:如果我这样做,那么C节点可能会向Erlang节点发送太多的消息,因此应该有一种方法将消息从Erlang节点发送到C节点以降低速度,否则Erlang节点可能会认为C节点已停机

我知道问题一定很短,一套又长又难看,但总而言之:


什么机制过程调用、算法可以用来为Erlang中的懒惰消费者开发C中的热切生产者,这样双方都知道底层上下文?

对于您描述的情况,我自己使用端口驱动程序,但没有触及C节点,因为我更愿意进行更多的解耦

请查看Erlang的端口驱动程序库:。有一个项目利用了此库:。

是否检查了该函数?我认为它的工作原理类似于Erlang的receive after构造,因此如果将timeout设置为0,它将是非阻塞的


我认为erl_接口已被弃用,应该改用ei。这可能是一个完全错误的信息…

您需要仔细查看您发布的教程链接。搜索并最终获得C节点客户端的代码。您将看到作者提供了一个客户端cnode实现。这看起来很合理。

问题是生产者将是C节点,而Erlang节点将是消费者。我考虑过使用端口的想法,但在连续循环中调用端口驱动程序服务似乎不是最好的方法。@zalmoxis:有许多不同的方法可以解决这种情况,其中之一可能是使用基于令牌的信用算法。消费者节点向生产者节点发送信用。每次发送都需要一个信用:当没有信用时,制作人必须等待下一次信用的交付。@zalmoxis:我上面描述的基于令牌的整形器可以很容易地在用C编写的制作人端实现,而在Erlang端添加对该方案的支持也同样简单。既然你已经在为使用C节点而苦恼,那么我知道你可以使用端口驱动程序。干杯,玩得开心!无论如何,一如既往地考虑我的贡献作为一个建议供您考虑。谢谢,我现在正在测试它。请注意,在超时为0的情况下调用ei_receive_msg_tmo将变为阻塞。好的。因此,显然,非超时函数会退回到ms=0的超时函数。这就是ms=0变为阻塞的原因。请参见ei_read_t函数erl_interface/src/misc/ei_portio.c。我认为这是懒惰战胜功能的胜利: ... if (emsg.type == ERL_REG_SEND) { ... while(1) { //generate tuple erl_send(fd, fromp, tuple); //free alloc resources } ... }