问题标签 [erl-interface]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
673 浏览

erlang - erlang: ei_get_type() : 'type' 字段的定义常量在哪里?

我正在尝试使用ei_get_type() ( ei ),但我无法找到记录“类型”字段的位置。我查看了ei.h,但我能找到的只是一个以“ERL_”开头的常量列表。

这是正确的列表吗?我不确定,因为er_get_type()的原型对于 type 字段有 *int ** 而ei.h文件定义了char上述常量。

注意:“erl_interface”包中使用的其他“常量”未在此处列出。

0 投票
2 回答
1654 浏览

c# - 调用非托管 dll 时的访问冲突

从 ac# 应用程序调用非托管 Dll 时,我得到一个AccessViolationException. 奇怪的是导出的函数没有参数,所以问题不在于数据的编组。该函数没有参数,只返回一个整数。另请注意,调用约定不是问题。具有相同零参数和整数返回值(但名称不同)的相同函数可以正常工作。考虑到编组和调用约定被排除的事实,这样的调用可能导致此异常的其余候选原因是什么?

更新: dll 函数是正确的,因为如果通过普通链接从其他非托管代码调用,那么它可以完美运行。

更新 2:一切都在 32 位上编译和运行。我试过 Win XP SP2 和 Vista。这是一个有趣的事实:在 Vista 系统上,它就像一个魅力。在 XP 上它失败了。

更新 3:我没有得到源代码,但我了解了这个 dll 的本质,所以我尝试用我自己的 dll 重现问题。故事是这样的:原始 dll 是 ei.lib(Erlang 的 c 接口库)的某种包装器。它导出一些辅助函数。因此,为了重现该问题,我在 ei.lib 周围制作了一个包装 dll,它只导出一个函数,即“test()”。我这样做是为了不会弄乱编组和其他东西。我只想测试初始化​​、连接和发送消息。所以我的 dll 的这个 test() 函数只是调用ei_connect_init(),然后ei_connect()最后ei_reg_send(),里面有硬编码的参数。问题是,如果我调用这个 dll 并使用另一个非托管代码中的 test() 函数,它可以正常工作。消息已发送。但是当我通过 DllImport 从 c# 调用它时,它只能在 Vista 上运行。不在XP上。在 XP 上,它在 .net 层上出现 AccessViolationException 失败。我试图追查问题,我从我的 dll 中看到,在 XP 上运行并被托管代码调用时,对 的任何调用ei_connect()或任何读取尝试(这些在 ei.lib 中定义)都会导致尝试读取erl_errno或写入受保护的内存,使应用程序崩溃。它不能是微不足道的,因为它可以在 Vista 上工作,并且在被非托管代码调用时也可以工作。

0 投票
1 回答
1393 浏览

erlang - Threaded Erlang C-Node(cnode) 互操作性如何?

在我的 Erlang 开发中,我需要创建一个 C-Node(请参阅C-Node 文档的链接)。基本实现很简单,但是文档中有一个巨大的漏洞。

该代码实现了单线程客户端和服务器。暂时忽略客户端......实现服务器的'c'代码是单线程的,一次只能连接到一个erlang客户端。

  1. 启动 EPMD ('epmd -daemons')
  2. 启动服务器应用程序('cserver 1234')
  3. 启动 erlang 客户端应用程序 ('erl -sname e1 -setcookie secretcookie') [在与 #2 不同的窗口中]
  4. 从 #3 中的 erlang shell 执行服务器命令 ('complex3:foo(3).')

现在服务器正在运行并且当前的 erlang shell 已连接到服务器,从另一个窗口再次尝试。

  1. 打开一个新窗口。
  2. 启动一个 erlang 客户端('erl -sname e2 -setcookie secretcookie')。
  3. 执行一个新的服务器命令('complex3:foo(3).')。

请注意,系统似乎挂起......它应该已经执行了命令。它挂起的原因是因为另一个 erlang 节点已连接,并且没有其他线程在侦听连接。

注意:连接处理中似乎存在错误。我在接收块中添加了一个超时,我发现了一些错误的行为,但我没有得到它们。此外,如果我在执行指示的步骤后强制第一个 erlang 节点终止,我能够让 cserver 在没有警告或错误的情况下崩溃。

所以问题是......实现线程化 C 节点的最佳方式是什么?什么是合理的连接数?

0 投票
1 回答
313 浏览

event-handling - 我可以在 C 节点中获得 Erlang OTP 行为吗?

例如,现在我有一个 C 节点(称为CN),它连接到一个 erlang 节点(称为EN)并使用 RPC 来使用 OTP 行为。因此,要将事件从CN发送到EN上的事件管理器,我将CN连接到EN并执行

但是,然后,我的 C 节点实际上并没有表现得像一个节点(即,为什么要创建一个只使用远程过程调用的节点?)。

有没有办法在 C 节点中直接使用 OTP 行为?

如果没有,我是否应该深入了解 OTP 使用的消息格式并使用该格式发送消息(即我可以欺骗 OTP 行为吗?)?我不喜欢这个想法,我将不得不注意 OTP 等实施的变化。

我的要求有严格的延迟限制,这对我选择 C ​​进程和 Erlang 之间的通信有何影响(RPC 会不会让我陷入困境?等等)?

0 投票
1 回答
1107 浏览

c - erl_interface 链接器错误

我需要在我的 C 程序中使用erl_interface 。Debian Wheezy 上有 Erlang R15B01。

我只是执行以下操作(例如)。

然后我说:

指定为 -L 的目录包含libei.aliberl_interface.a链接器滥用对 erl_init 的引用是未定义的:undefined reference to erl_init

可能有什么问题?抱歉问了一个非常愚蠢的问题。

0 投票
1 回答
260 浏览

c - 如何正确释放 erlang 术语

在示例erlang 端口程序中

erl_free_compound 和 erl_free_term 都用于释放相同 ETERM* 的术语(及其子术语)。从 erl_free_compund() 的文档中它说

erl_free_compound() 将递归地释放与给定 Erlang 术语相关的所有子术语

所以,我的问题是,erl_element() 是否会复制元素,如果不单独释放会泄漏内存,或者上述情况可能导致双重释放,由 erl_free_term 检测和处理。

0 投票
0 回答
73 浏览

c++ - erl_eterm doc和erl_interface.h信息冲突?

我不明白erl_etermerl_interface.h之间的以下内容

erl_eterm中,以下描述为:

erl_interface.h中,它们被定义为

如果 ERL_ATOM_PTR/ERL_ATOM_PTR_UTF8 需要与 ERL_ATOM_SIZE/ERL_ATOM_SIZE_UTF8 一起使用来构造一个以 NULL 结尾的 c 字符串 (char*),则对于 ERL_*_NODE* 宏也应该如此,因为它们的定义都相似。并且它们都没有返回文档中定义的 ETERM*。

我在这里想念什么?

0 投票
1 回答
168 浏览

process - 在 Erlang C 节点中实现进程链接

我知道不支持在 C 节点上监视“进程”,但是如果我尝试为源自 Erlang 节点上的 C 节点的 pid 调用链接,我的 C 节点首先会收到一条ERL_LINK消息,然后过一会儿会收到一条ERL_EXIT消息因为显然链接的 Erlang 进程崩溃了。

可能是因为我的 C 节点没有响应ERL_LINK并且 Erlang 确定我的 C 节点“进程”已经死亡。

我想知道这是否被支持?以及 C 节点需要如何处理ERL_LINK消息才能使其工作。

0 投票
2 回答
183 浏览

c - 从 C 向 GenServer 发送消息

如何向远程 Elixir GenServer 发送消息,然后使用C Erlang 接口接收调用结果?

我想在 C 中运行类似于

这是我到目前为止所拥有的。它编译并连接到远程服务器并运行ei_reg_send而不会导致错误,但远程服务器没有收到响应。(我打开了一个记录器,所以我知道什么时候来电。)