私はプログラムの状態をプログラム的に監視することに興味があります(このプロセスは私のプロセスではなく、私のプロセスの子でもありません)。特定のプロセス(またはそのバリエーションの1つ)が発生するたびにexec
増加するカウンターまたは変更される識別子はありますか?sysctl
などのタイトルを確認しましたが、libproc.h
似たような内容が見つかりませんでした。
明らかに、PIDは変更されませんが、実行可能なパス、パラメータ、および環境変数は変更されます。可能変化。これらの値をポーリングして変更を検出できます。すべての変更は変更を表しますexec
が、同じ実行可能ファイル、args、およびenvを使用してプロセスをexec
呼び出すこともできます(奇妙ですが)。これによりアラームは発生しません。
私は最終的にDarwinがやっていることに興味がありますが、すべての* nixに存在する可能性のある同様のメカニズムについて聞きたいです。これは少なくとも私にさらなる研究のための出発点を提供します。
答え1
オペレーティングシステムによっては、以下を使用する必要があります。
strace # on linux. you can attach to a pid (if you (as root?) have the rights to do so)
# you can also "follow its children" (using the appropriate options : `man strace` )
他のUNIXには同等の機能(他の機能を含む)があります(オペレーティングシステムにインストールすることもできます)。
dtrace # bsd originated, I believe. Should be present also on macos?
dtruss # on macos
truss # on aix
など。
それぞれについて:実行したい操作を実行するために必要な適切な引数を見つける必要があります。 (例:通常、デフォルトは欠けているものを隠し、システムコール引数を最初の数文字に切り捨てます。これらはすべてオプションで変更できます)
stderrに何かが出力されることを確認してください(おそらく)。そして、必要なタスクを実行するスクリプトでパッケージ化します。 (例: 2>/some/tracefile # 別のスクリプト tail -f /some/tracefile を持っていて、このシステムコールまたは低システムコールが来るのを見た場合は、対処してください。)