4

Luaのモジュールを書いています。ユーザーが暗黙的にシャットダウン ルーチンを呼び出すのを忘れた場合でも、lua インタープリターを閉じるときに、クリーンアップ ルーチンを実行する必要があります。

モジュールはほとんど C で書かれています。

プログラム実行の終了を検出するには、Lua C Api でどのコールバックを使用すればよいですか? 私が思いついた唯一のアイデアは、モジュールを表すテーブルで __gc メタメソッドを使用することです。何か案は?

4

1 に答える 1

4

C モジュールから行う簡単な方法は、フルuserdatawith metatablea__gcメタメソッドを作成することです。モジュールの環境内のフィールドに保存して、モジュールがアンロードされるまで GC によって収集されないようにします。

manualによると、コレクターによって呼び出されるメタメソッドのみuserdataを取得するため、テーブルを使用してモジュールのファイナライザーを保持することはできません。__gc

ファイナライザーを必要とする純粋な Lua で書かれたモジュールの場合、userdataそれを保持するためにまだ必要です。サポートされておらず、文書化されていませんが、広く知られている関数を使用して、この目的で使用するメタテーブルを使用してnewproxy()空のオブジェクトを作成できます。asをuserdata呼び出してメタテーブルを取得し、メタテーブルを取得してメタメソッドを追加できるようにします。newproxy(true)getmetatable()__gc

于 2010-10-12T07:52:20.323 に答える