UNIXプロセスがロードし、その存続期間を通して使用する可能性のあるライブラリーを見つける必要があります。これは可能ですか?あるいは、ライブラリ名があり、どのプロセスがそれを使用しているかを調べる必要がありますが、これは可能です。
同じように、UNIXプロセスがいつ起動し、いつ終了するかを通知することは可能ですか?それらは私のプロセスの子プロセスではなく、グローバルに知る必要があるだけです。
更新:
情報が足りなかったようです。私が話していたunixはMacOS Xであり(実際には完全にunixではないという人もいます)、プロセスに読み込まれているライブラリを見つける方法を探していました。C/ C++でそれを行う必要があります。
lsofがインストールされていない場合は、単に/ proc/$ pid/mapsをcatできます
lddを使用してディスク実行可能ファイルをチェックし、それらが開くライブラリを確認することもできます(ただし、dlopen()を使用して動的に開かれたライブラリは表示されません)。
新しいプロセスの監視については、/ procにinotify監視を追加して、新しい数値のみのディレクトリの作成/破棄を監視できます。
更新:/ procのinotifyは機能しませんが、明らかに代替案があります。 このスレッド を参照してください
OS Xでは、DYLD_PRINT_LIBRARIES
export DYLD_PRINT_LIBRARIES=1
./your_process
Mac OS Xでは、vmmap $pid
を使用して、プロセスに割り当てられたメモリ領域のリストを取得できます。これは、読み込まれたすべてのライブラリを表示します(少なくとも、ここでは10.7.5で機能します)。
ps -A
はすべてのプロセスのリストを提供するため、ps -A | grep $APPNAME
はvmmap $pid
で使用するプロセスID $ pidを取得します。 lsof -p $pid
も機能します。
問題は、C++からの動的メソッドを要求しているようです。これらのコマンドでポーリングして結果を分析できますが、高速のロード/アンロードイベントを見逃す可能性があります。
lsof
は、BSDライセンスに基づくオープンソースソフトウェアです。そのソースコードは間違いなく、C/C++からこれを行う方法についての洞察を提供します。参照: http://en.wikipedia.org/wiki/Lsof
lsofを使用できます。詳細については、manページを参照してください。別のツールはstrace
です。プロセスが起動されているかどうかを確認するには、ps -ef
をgrep
にパイプするか、pgrep
のようなツールも使用します。戻り値をチェックして、終了したかどうかを確認します。
私もこれをしようとしています(失敗しています)。 mach_vm_readとvm_region_recurse_64を見てください。 vmmapやAppleのCrash Reporterなどのクローズドソースアプリケーションも、これらのメソッドとオープンソースGDBを使用してこれを行います。そこを探して答えを探すこともできますが、ソースを読むのは簡単ではありません。
私はあなたが探している具体的な答えはありませんが、私は近いものを持っています。それはおそらくあなたが望むものに近づくでしょう。次の方法で、特定のバイナリ(プロセスではない)のリンクライブラリを表示できます。
例:
chris$ otool -L /usr/local/bin/mtr
mtr:
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)
/usr/lib/libncurses.5.4.dylib (compatibility version 5.4.0, current version 5.4.0)
/usr/lib/libresolv.9.dylib (compatibility version 1.0.0, current version 46.1.0)