4

-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 シェル内からテストしました。私にとって何かヒントがありますか、私が間違っていることは何ですか?

4

1 に答える 1

4

マニュアルによると、このコードは新しく生成されたプロセスで実行され、関数が戻るとすぐに終了します。

作成したETSテーブルは、所有プロセスが終了すると削除されます。これは標準のETS動作です。etsのmanページで言及されている内容は次のとおりです。

テーブルの自動ガベージコレクションはないことに注意してください。どのプロセスからもテーブルへの参照がない場合でも、所有者プロセスが終了しない限り、テーブルは自動的に破棄されません。delete/1を使用して明示的に破棄できます。デフォルトの所有者は、テーブルを作成したプロセスです。テーブルの所有権は、プロセスの終了時に、heirオプションを使用するか、give_away/3を呼び出すことによって明示的に譲渡できます。

于 2012-10-09T15:19:11.557 に答える