【发布时间】:2009-12-23 20:04:57
【问题描述】:
在提供的教程中: 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 节点不应该确保它已经接收到消息,而不是它必须用处理结果来回复。因此,一旦发送了消息,我就不再关心它的信仰了。
有人可能认为可以将代码修改为:
... 如果(emsg.type == ERL_REG_SEND){ ... 而(1){ //生成元组 erl_send(fd, fromp, 元组); //释放分配资源 } ... }这将产生一个无限循环,我们在其中生产和消费(发送)消息。 但是有一个重要的问题:如果我这样做,那么C节点可能会向Erlang节点发送过多的消息(所以应该有办法从Erlang节点向C节点发送消息以减慢速度),或者Erlang 节点可能认为 C 节点已关闭。
我知道问题一定很短(这又长又丑),但总结一下:
可以使用什么机制(过程调用、算法)在 C 中为 Erlang 中的懒惰消费者开发一个急切的生产者,以便双方都知道底层上下文?
【问题讨论】:
标签: erlang