著者: goosman.lei(雷國国)
ブログ: http://blog.csdn.net/lgg201
メール: lgg860911@yahoo.com.cn
関連するコードについては、書籍「php の拡張と埋め込み」の第 12 章「拡張グローバル」セクションを参照してください。
拡張機能を登録するためのグローバル空間コードは次のとおりです:
#ifdef ZTS
ts_allocate_id(&sample_globals_id, sizeof(zend_sample_globals), (ts_allocate_ctor)ZEND_MODULE_GLOBALS_CTOR_N(サンプル), (ts_allocate_dtor)ZEND_MODULE_GLOBALS_DTOR_N(サンプル));
#else
sample_globals_ctor(&sample_globals TSRMLS_CC);
#endif
ts_allocate_id() 関数呼び出しでは、レコードが resource_types_table 配列に書き込まれます。
tsrm_shutdown()の処理中に、登録されたdtorコールバック関数が呼び出されます。
しかし、本に従ってコーディングを終えた後、テストコードを実行するとコアダンプが発生します。
追跡の結果、zend_shutdown()の呼び出しプロセス中にモジュールでDL_UNLOAD(module->handle)が呼び出され、tsrm_shutdown()の実行時にその時点で登録されたハンドル(dtor)にアクセスできなくなることが判明しました。 ).
同時に、この登録方法は標準拡張子の ext/standard/file.c でも使用されていることがわかりました。ただし、静的にコンパイルされる必要があるため、問題はありません。また、私の拡張子は、動的にコンパイルされています。リンクされました。
以下は、zend_shutdown() から DL_UNLOAD() までのトレース パスです。
zend_shutdown() => zend_desctroy_modules() => zend_hash_apply_deleter() =>
http://www.bkjia.com/PHPjc/477806.html
www.bkjia.comtruehttp://www.bkjia.com/PHPjc/477806.html技術記事著者: goosman.lei (Lei Guoguo) ブログ: http://blog.csdn.net/lgg201 メール: lgg860911@yahoo.com.cn 関連するコードについては、書籍「php の拡張と埋め込み」の第 12 章、「拡張」セクションを参照してください。グローバル ...