-on_load如何在erlang中工作?

时间:2012-10-09 12:15:04

标签: erlang

我似乎不完全理解-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中测试过它。对我来说有什么暗示,我做错了什么?

1 个答案:

答案 0 :(得分:4)

manual表示此代码在新生成的进程中运行,该进程在函数返回后立即终止。

一旦拥有进程终止,您创建的ETS表将被删除。这是标准的ETS行为。以下是ets man page提到的内容:

  

请注意,表没有自动垃圾回收。即使   没有来自任何进程的表的引用,它不会   除非所有者进程终止,否则将自动销毁。它可以   使用delete / 1明确销毁。默认所有者是   创建表的进程。表所有权可以转移到   通过使用继承选项或通过调用显式处理终止   give_away / 3。