Luaのモジュールを書いています。ユーザーが暗黙的にシャットダウン ルーチンを呼び出すのを忘れた場合でも、lua インタープリターを閉じるときに、クリーンアップ ルーチンを実行する必要があります。
モジュールはほとんど C で書かれています。
プログラム実行の終了を検出するには、Lua C Api でどのコールバックを使用すればよいですか? 私が思いついた唯一のアイデアは、モジュールを表すテーブルで __gc メタメソッドを使用することです。何か案は?
C モジュールから行う簡単な方法は、フルuserdata
with metatable
a__gc
メタメソッドを作成することです。モジュールの環境内のフィールドに保存して、モジュールがアンロードされるまで GC によって収集されないようにします。
manualによると、コレクターによって呼び出されるメタメソッドのみuserdata
を取得するため、テーブルを使用してモジュールのファイナライザーを保持することはできません。__gc
ファイナライザーを必要とする純粋な Lua で書かれたモジュールの場合、userdata
それを保持するためにまだ必要です。サポートされておらず、文書化されていませんが、広く知られている関数を使用して、この目的で使用するメタテーブルを使用してnewproxy()
空のオブジェクトを作成できます。asをuserdata
呼び出してメタテーブルを取得し、メタテーブルを取得してメタメソッドを追加できるようにします。newproxy(true)
getmetatable()
__gc