2

atexit()次のような関数の使用法を説明するチュートリアルがいくつかあります。

http://linux.die.net/man/3/atexit

例は、簡単に理解できる main 関数で提供されます。ただし、プログラムで共有ライブラリを作成しており、他のプログラムからエクスポートする関数をいくつか提供しています。別のプログラムが共有ライブラリをアンロードするときに、共有ライブラリ内のいくつかのスレッドを停止したいと考えています。atexit()ユーザーに関数の呼び出しを強制せずに、共有ライブラリの実装で使用するにはどうすればよいdestroy()ですか?

前もって感謝します。

4

2 に答える 2

7

ドキュメントには次のように記載されています。

glibc 2.2.3 以降、atexit() (および on_exit(3)) を共有ライブラリ内で使用して、共有ライブラリがアンロードされたときに呼び出される関数を確立できます。

一方、グローバル スコープのオブジェクトを作成し、そのデストラクタでコードを整理してみませんか?

于 2012-05-22T13:29:18.167 に答える
5

そうすることは避けるべきです (本当に強い理由で本当にそうしなければならない場合を除きます)。

ライブラリは関数を提供するだけで、アプリがそれをどのように使用するかを自由にする必要があります。ライブラリがいくつかのヘルパー スレッドを開始する関数をエクスポートする場合は、それを停止して適切に文書化する関数も提供します。割り当てられたリソースを解放するというアプリの責任を果たし続けます。

lib_init() を呼び出すが lib_uninit() を忘れるバグのあるプログラムを修正することがあなたの考えである場合は、それを忘れてください。これにより、lib がより複雑になり、アプリのすべての潜在的なバグを修正することはできません。プログラマーが作成できるようになり、そのようなアプリケーションのデバッグは難しくなります。

IMHO、ライブラリは(可能な限り)一部のグローバルプロセスのものを変更しないようにする必要があります。そのようなライブラリは、アプリケーションの設計方法に制限を引き起こすためです。このようなライブラリは悪夢です。特に、複数のライブラリとリンクしていて、アプリケーションの作成方法が矛盾している場合はなおさらです。

于 2012-05-22T13:36:57.540 に答える