我似乎不完全理解-on_load指令的工作原理。在我编写的模块中,我有一个函数来初始化一个ets表并用一些数据填充它。显式调用此函数时,此函数可正常工作。但是:我认为如果在加载模块时“自动”填充ets表会很好。但这似乎不起作用,因为ets:info(filesig)
在加载模块后告诉我“未定义”。相关代码类似于:
...
-on_load(init/0),
init() ->
% load filesig database into ETS
{_, Signatures} = file:consult("path to a file"),
ets:new(filesig, [set, protected, named_table]),
ets:insert(filesig, Signatures),
ok.
...
我在erlang shell中测试过它。对我来说有什么暗示,我做错了什么?
答案 0 :(得分:4)
manual表示此代码在新生成的进程中运行,该进程在函数返回后立即终止。
一旦拥有进程终止,您创建的ETS表将被删除。这是标准的ETS行为。以下是ets man page提到的内容:
请注意,表没有自动垃圾回收。即使 没有来自任何进程的表的引用,它不会 除非所有者进程终止,否则将自动销毁。它可以 使用delete / 1明确销毁。默认所有者是 创建表的进程。表所有权可以转移到 通过使用继承选项或通过调用显式处理终止 give_away / 3。