• ベストアンサー

C言語 特定のプロセスの終了を監視

I フィルター(有害サイトブロックソフト)って知っていますか?あのソフトは、2つのプログラムから成っていて、片方のプロセスを終了させるともう片方のプロセスが起動し、互いに監視しあっているので簡単には終了できません。 そのようなこと(つまり、簡単に終了させることができないようにプロセス2つで監視し合っている)をC言語で行いたいのですが、プロセスを監視するとか全然わかりません。 とっても初心者なので、できる限り詳しく、ソースコードなどもあればとてもうれしいのですが・・・ 手間のかかる質問ですが、どうぞ回答してくださるかたよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

Windowsの場合、WMIを使ってプロセスを監視できます。 'Excelが稼動しているか調べるスクリプト Dim A,B,C,D Set A=CreateObject("WbemScripting.SWbemLocator") Set B=A.ConnectServer() C="Select * from Win32_Process WHERE Caption='Excel.exe'" Set D=B.ExecQuery(C) If D.Count=0 Then     MsgBox "Excelは稼動していません" Else     MsgBox "Excelが稼動しています" End If で、これをC言語でやるととても難しくなります。 全部書けないので、さわりだけやりますと、 Set A=CreateObject("~") は以下のようにします。 #include <windows.h> int main(int a,char *v[]) { IDispatch *l; HRESULT r; CLSID d; r = CLSIDFromString(L"WbemScripting.SWbemLocator",&d); if ( !r ) {     CoInitialize(NULL);     r = CoCreateInstance(d,NULL,CLSCTX_SERVER,                   IID_IDispatch,(LPVOID*)&l);     if ( !r ) {         以下正常時の処理 どうですか、面倒でしょう。プロパティだのメソッドなんか ピリオドで名前書けば済む話ではありません。 Cでやる時は名前からプロパティやメソッドのDISPIDを 取得し、これにパラメータ(必ずVARIANT型)を指定して Invokeメソッドを実行します。また使用後はReleaseで、 メモリ空間を解放しないと、厄介なことになります。 スクリプトですと10行くらいですが、Cでやると200行は かかるでしょうね。 続きをどうしても見たい場合はまた補足してください。 こんなことなら、スクリプトをシェル起動して戻り値を 見たほうが速い?そうです。その通りです。 スクリプトを起動するならCreateProcessを使います。

noname#153104
質問者

お礼

そうですね、そうします!!200行ですか…大変だぁ… これからはしたい動作を一番やりやすい言語で書いて、それを起動する方法を使えるようにします!! ちなみに一番上はVBSですよね?C以外のことには疎いのですが…まぁ頑張ります!!

noname#153104
質問者

補足

お礼に対する補足というか訂正ですが、WMIとかいてありました…また変なこと言ってすいません。

その他の回答 (1)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

プロセスの状態を知るには、OSの機能を使う必要があります。 規格としての「C言語」には含まれていません。 OSの機能を使うので、当り前ですがOSによって使う関数や約束事が違います。 お使いのOSのAPIやシステムコールのマニュアルを読んで探してください。場合によってはサンプルコードが載っています。 ただ、プロセス制御は、やりかたを間違えるととんでもないことになりやすいです。例えば、生存していることの判定に失敗して、再起動させようとして、プロセスを作りまくってしまう、とか。 「とっても初心者」などと言っているような人なら、もっと基礎を身に付けてからやった方がよいでしょう。

noname#153104
質問者

お礼

たしかに、もうちょっと知識をつけてからでないととんでもないことになりそうですね。 一応Cのコンソールアプリケーションならいろいろ作れる実力?はありますが、プロセス制御などはじめてだったので超初心者と書かせていただきました。回答、ありがとうございました!!

関連するQ&A