プログラムの実行前にプリロードできる次のライブラリを検討してください。
// g++ -std=c++11 -shared -fPIC preload.cpp -o preload.so
// LD_PRELOAD=./preload.so <command>
#include <iostream>
struct Goodbye {
Goodbye() {std::cout << "Hello\n";}
~Goodbye() {std::cout << "Goodbye!\n";}
} goodbye;
問題は、グローバル変数のコンストラクターgoodbye
は常に呼び出されますが、次のような一部のプログラムではデストラクタが呼び出されないことですls
。
$ LD_PRELOAD=./preload.so ls
Hello
他の一部のプログラムでは、デストラクタが期待どおりに呼び出されます。
$ LD_PRELOAD=./preload.so man
Hello
What manual page do you want?
Goodbye!
最初のケースでデストラクタが呼び出されない理由を説明できますか? EDIT:上記の質問はすでに回答されています。つまり、プログラムは_exit()、abort()を使用して終了する可能性があります。
でも:
プリロードされたプログラムの終了時に特定の関数を強制的に呼び出す方法はありますか?