重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

今回はじめて参加させて頂きます。
宜しくお願い致します。

質問なのですが、
今回、Cプログラムでストール監視プロセスを作成し、
別のプロセスを監視したいと思っています。
そこで、ストール監視の方法として一般的なやり方及び何かいい方法がありましたら
ご教授の程、宜しくお願い致します。

A 回答 (1件)

こんばんは。



開発環境やターゲットが判らないのでWIN系と仮定して書きますね。

一般的な方法かどうかは不明ですが、私なら…
何らかの方法で監視対象となるプロセスのプロセスハンドルを取得し、
WaitForSingleObject で待つ手法を選択します。

WaitForSingleObject または WaitForMultipleObjects でプロセスの
ハンドルを待機した場合は、そのプロセスが終了(自発的に終了含む)
した場合にシグナルとなり制御を戻します。

その後は GetExitCodeProcess 等で終了理由を伝搬し、再開動可能な
状況なら対象プロセスを再起動、何度やっても同じ状況になることが
推測できる場合(動作環境不備とか)は警告メッセージ、等々。


この場合、監視する側がどうやって監視される側を認識するかが1つの
ポイントになります。

監視する側:A、監視される側:B、とします。

1.AがBを起動する場合
対象プロセスBを CreateProcess した時に取得する PROCESS_INFORMATION
構造体が持つ hProcess でOKです。

2.BがAを起動する場合
B自身のプロセスIDを、A起動時の引数等に指定して引き渡し、A内部で
OpenProcess を使ってハンドルを取得します。

3.第3者CがAもBも起動する場合
Bを先に起動し、PROCESS_INFORMATION に設定されたプロセスIDをAの
起動引数に。後は2番の手法と同じ。

4.起動時の制御が困難、または両者の起動が全く無関係な経路の場合
B→Aに何とかしてB自身のプロセスIDを伝える。所謂プロセス間通信
の考えが必要になると思います。

・共有メモリ(またはファイル)と同期オブジェクトを使って情報伝搬
・パイプやソケット等を使って文字通り通信する
等が挙げられますが、この辺りについては「プロセス間通信」で検索を
掛ければ多数ヒットするようですので御参考にどうぞ。

5.4番の手法も不可能な場合
監視対象Bのプログラムに対しては手を加えられない場合等が該当。
これは力業になってしまいますが…
現在起動中の全プロセスを列挙(一覧を取得)し、その中からプロセス名
等を元に監視対象プロセスを探し出す。そこまでやればプロセスと対に
なるプロセスIDも取得できている筈なので、2番と同じようにハンドル
を取得します。

以上、参考になったでしょうか。
    • good
    • 0
この回答へのお礼

こんにちは。

回答ありがとうございました。

大変参考になりました。本当にありがとうございます。

また何かありましたら、宜しくお願い致します。

お礼日時:2003/07/18 11:32

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!