问题描述
我正在使用 NIF 将 C++ api 与 Elixir 集成。现在,每当我加载 NIF 时,我都想初始化一些将在 NIF 调用中持久化的变量/数据。我试图通过 load
调用中提到的 ERL_NIF_INIT
函数实现相同的目标。但是我在加载功能之外观察到一些奇怪的行为。请看下面提到的例子,然后我会进一步解释这个问题:
#include <erl_nif.h>
static ERL_NIF_TERM sample(ErlNifEnv *env,int argc,const ERL_NIF_TERM argv[]) {
return enif_make_atom(env,"ok");
}
static ErlNifFunc nif_funcs[] = {{"sample",1,sample}};
static int load(ErlNifEnv *env,void **priv_data,ERL_NIF_TERM load_info) {
try {
1 / 0; // nif loads if this is the case
int x = 1 / 0; // float point exception segmentation fault when used this line
} catch (...) {
return 1;
}
return 0;
}
ERL_NIF_INIT(Elixir.Sample,nif_funcs,load,NULL,NULL);
现在仔细观察包含 load
块的 try/catch
函数,当我在 1 / 0;
块的主体中使用 try
表达式时,NIF 已加载,但是当表达式 { {1}} 替换为 1 / 0;
erlang vm 无法加载 NIF 并与 int x = 1 / 0;
崩溃,即使我添加了 floating point exception segmentation fault
块来处理异常。谁可以给我解释一下这个?我真的需要帮助。
这是用于接口的 Elixir 代码:
try/catch
用于编译 NIF defmodule Sample do
@on_load :load_nifs
def load_nifs do
:ok =
:sample
|> :code.priv_dir()
|> Path.join("sample")
|> :erlang.load_nif("0.0.1")
end
def sample(_) do
raise "sample/1 Function not implemented"
end
end
的命令
附言- 感谢您花时间阅读本文,非常感谢。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)