在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中开发一个热切的生成器,这样双方都能够了解底层的上下文?
| 归档时间: |
|
| 查看次数: |
1895 次 |
| 最近记录: |