问题标签 [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.
erlang - erlang: ei_get_type() : 'type' 字段的定义常量在哪里?
我正在尝试使用ei_get_type() ( ei ),但我无法找到记录“类型”字段的位置。我查看了ei.h,但我能找到的只是一个以“ERL_”开头的常量列表。
这是正确的列表吗?我不确定,因为er_get_type()的原型对于 type 字段有 *int ** 而ei.h文件定义了char上述常量。
注意:“erl_interface”包中使用的其他“常量”未在此处列出。
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 上工作,并且在被非托管代码调用时也可以工作。
erlang - Threaded Erlang C-Node(cnode) 互操作性如何?
在我的 Erlang 开发中,我需要创建一个 C-Node(请参阅C-Node 文档的链接)。基本实现很简单,但是文档中有一个巨大的漏洞。
该代码实现了单线程客户端和服务器。暂时忽略客户端......实现服务器的'c'代码是单线程的,一次只能连接到一个erlang客户端。
- 启动 EPMD ('epmd -daemons')
- 启动服务器应用程序('cserver 1234')
- 启动 erlang 客户端应用程序 ('erl -sname e1 -setcookie secretcookie') [在与 #2 不同的窗口中]
- 从 #3 中的 erlang shell 执行服务器命令 ('complex3:foo(3).')
现在服务器正在运行并且当前的 erlang shell 已连接到服务器,从另一个窗口再次尝试。
- 打开一个新窗口。
- 启动一个 erlang 客户端('erl -sname e2 -setcookie secretcookie')。
- 执行一个新的服务器命令('complex3:foo(3).')。
请注意,系统似乎挂起......它应该已经执行了命令。它挂起的原因是因为另一个 erlang 节点已连接,并且没有其他线程在侦听连接。
注意:连接处理中似乎存在错误。我在接收块中添加了一个超时,我发现了一些错误的行为,但我没有得到它们。此外,如果我在执行指示的步骤后强制第一个 erlang 节点终止,我能够让 cserver 在没有警告或错误的情况下崩溃。
所以问题是......实现线程化 C 节点的最佳方式是什么?什么是合理的连接数?
event-handling - 我可以在 C 节点中获得 Erlang OTP 行为吗?
例如,现在我有一个 C 节点(称为CN),它连接到一个 erlang 节点(称为EN)并使用 RPC 来使用 OTP 行为。因此,要将事件从CN发送到EN上的事件管理器,我将CN连接到EN并执行
但是,然后,我的 C 节点实际上并没有表现得像一个节点(即,为什么要创建一个只使用远程过程调用的节点?)。
有没有办法在 C 节点中直接使用 OTP 行为?
如果没有,我是否应该深入了解 OTP 使用的消息格式并使用该格式发送消息(即我可以欺骗 OTP 行为吗?)?我不喜欢这个想法,我将不得不注意 OTP 等实施的变化。
我的要求有严格的延迟限制,这对我选择 C 进程和 Erlang 之间的通信有何影响(RPC 会不会让我陷入困境?等等)?
c - erl_interface 链接器错误
我需要在我的 C 程序中使用erl_interface 。Debian Wheezy 上有 Erlang R15B01。
我只是执行以下操作(例如)。
然后我说:
指定为 -L 的目录包含libei.a
但liberl_interface.a
链接器滥用对 erl_init 的引用是未定义的:undefined reference to erl_init
可能有什么问题?抱歉问了一个非常愚蠢的问题。
c - 如何正确释放 erlang 术语
在示例erlang 端口程序中
erl_free_compound 和 erl_free_term 都用于释放相同 ETERM* 的术语(及其子术语)。从 erl_free_compund() 的文档中它说
erl_free_compound() 将递归地释放与给定 Erlang 术语相关的所有子术语
所以,我的问题是,erl_element() 是否会复制元素,如果不单独释放会泄漏内存,或者上述情况可能导致双重释放,由 erl_free_term 检测和处理。
c++ - erl_eterm doc和erl_interface.h信息冲突?
我不明白erl_eterm和erl_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*。
我在这里想念什么?
process - 在 Erlang C 节点中实现进程链接
我知道不支持在 C 节点上监视“进程”,但是如果我尝试为源自 Erlang 节点上的 C 节点的 pid 调用链接,我的 C 节点首先会收到一条ERL_LINK
消息,然后过一会儿会收到一条ERL_EXIT
消息因为显然链接的 Erlang 进程崩溃了。
可能是因为我的 C 节点没有响应ERL_LINK
并且 Erlang 确定我的 C 节点“进程”已经死亡。
我想知道这是否被支持?以及 C 节点需要如何处理ERL_LINK
消息才能使其工作。
c - 从 C 向 GenServer 发送消息
如何向远程 Elixir GenServer 发送消息,然后使用C Erlang 接口接收调用结果?
我想在 C 中运行类似于
这是我到目前为止所拥有的。它编译并连接到远程服务器并运行ei_reg_send
而不会导致错误,但远程服务器没有收到响应。(我打开了一个记录器,所以我知道什么时候来电。)