• ベストアンサー

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

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

noname#153104
noname#153104

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

  • ベストアンサー
  • 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

  • プロセスがタスクマネージャーに残るのは、なぜ?

    vbのプログラムから、GetExitCodeProcessとDo Whileを使用し外部プログラム(メモ帳など)の実行、監視しています。何かの表示しに、外部プログラムが終了しているにもかかわらず終了コードが取れないことがあり、タスクマネージャーを見ると、プロセスが残っている状態です。 なぜ、終了コードが取れずに、プロセスが残るのでしょうか? 何か参考があればよろしくお願いします。

  • WMIでのプロセスの起動・終了監視について

    WMIでのプロセスの起動・終了監視について ●環境 Microsoft VC++ 6.0 Windows XP Pro ●質問 http://mrxray.on.coocan.jp/Delphi/plSamples/902_WMI_ProcessCreateTerminate.htm の「04_プロセス(アプリケーション)の起動と終了を監視」を参考に、VCに置き換えて作成したのですが途中で詰まってしまいました。 get_Classによる取得までできて、プロセスの作成・終了までは分かるようになったのですが そのプロセスの情報が取得できません(プロセスIDや名前など)、参考にしたページ(Delphi)ではTargetInstanceから取得できるようなのですが、VCではそのプロパティ(?)が見つからず情報を取得出来ませんでした どうすれば、プロセスの情報を取得出来るのでしょうか? よろしくお願いします。 ●ソース _COM_SMARTPTR_TYPEDEF(ISWbemEventSource, __uuidof(ISWbemEventSource)); _COM_SMARTPTR_TYPEDEF(ISWbemObject, __uuidof(ISWbemObject)); _COM_SMARTPTR_TYPEDEF(ISWbemObjectPath, __uuidof(ISWbemObjectPath)); ISWbemEventSourcePtr SWbemEventSourcePtr; hResult = SWbemServices->ExecNotificationQuery(_bstr_t(L"SELECT * FROM __InstanceOperationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'"), _bstr_t(L"WQL"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &SWbemEventSourcePtr); while(TRUE) { ISWbemObjectPtr SWbemObjectPtr; hResult = SWbemEventSourcePtr->NextEvent(-1, &SWbemObjectPtr); CString ccc; { ISWbemObjectPathPtr SWbemObjectPathPtr; hResult = SWbemObjectPtr->get_Path_(&SWbemObjectPathPtr); CComBSTR ClassString; hResult = SWbemObjectPathPtr->get_Class(&ClassString); ccc = ClassString; } ■■■ここでプロセスに関する情報を取得したい■■■ if(ccc == "__InstanceCreationEvent"){ // プロセス作成 } else if(ccc == "__InstanceDeletionEvent"){ // プロセス終了 } }

  • C言語の ^= ついて

    C言語初心者です。 ソースを読んでいたんですが、      a[i][j] ^= rk[i][j]; のようなコードが出てきたのですが、^= ってなんですかね? 基本的な様な事ですみませんがお教え願えないでしょうか。 お願いします。

  • 変換プログラムってどうやって作るのですか??c言語超初心者です。おねがいしますm(__)m

    大学の課題で、「カレンダのデータをiモードで見れるようにする変換プログラムを作りなさい」というのが出されたのですが、正直なんのことだかさっぱりわかりません(汗) 私なりに一生懸命考えた限りはこうです▽ ・文字コード変換プログラムをつくればいいのかな? ・もしくは、データベースをiモードでみれるようにするようにタグを付け加えていくプログラムかな? 環境はUNIXのC言語です。 c言語はまったくの初心者なので文字コード変換プログラムとかもつくれないです。どうか助けてください。

  • 自分のアプリケーションがプロセス終了したときのイベントを検出したいので

    自分のアプリケーションがプロセス終了したときのイベントを検出したいのですが、どうすれば良いですか? プログラム言語はC#です。 よろしくおねがいします。

  • Fortran と、C言語のデータの受け渡し

    Micro Soft Visual C++ 上で Fortran と、C言語のデータの受け渡しをしたいのですが、例えばC言語でint型のi,jを読み込み、Fortranでi,jを受け取り、その和kを求め、kをC言語に受け渡し、printfでkの値を表示させるプログラムはどんな感じになるんでしょうか? お手数ですがCとFortranのソースコードを教えていただけたらうれしいです。 また、Micro Soft Visual C++ 6.0 と Visual Fortran 6.1a ではできないのでしょうか? 教えてください。

  • ウィンドウを閉じてもタスクマネージャではプロセスが終了しない?

    メモリ使用量監視ソフトをインストールして気がついたのですが、 アプリを終了させたはずなのにメモリが解放されていませんでした。 不思議に思いタスクマネージャを立ち上げてプロセスを確認すると、 まだ起動した状態になっており、再度同じアプリを立ち上げると、 同じプロセスが多重起動してしまいました。 それからタスクマネージャを起動したまま色んなソフトを起動してみたのですが、 この現象が起きるソフトと起きないソフトがありました。 ■この現象が起きるプログラム ・Adobe CS3 シリーズ ・Filemaker Pro 8 ・IE 7 ・Google Chrome ・タスクマネージャ など ■この現象が起きないプログラム ・ad-ware2008 ・Windows Live Mail ・FireFox しばらくテストしていて気がついたのですが、 ウィンドウを閉じる「×」を押した場合のみプロセスが残り、 alt+F4で終了させた場合は正常に終了できるようで、 タスクマネージャにはプロセスが残りませんでした。 以下質問なのですが、 1、これは正常な動作なのでしょうか? 2、正常では無い場合、何か解決方法があるのでしょうか? ご教授のほどお願いいたします。

  • C言語

    C言語初心者です。 整数を入力しその数が偶数ならプログラムを終了する。奇数ならそれが3の倍数か3の倍数でないかを表示する。入力した数が奇数ならこの操作を何回も繰り返すプログラムを作りたいです。 このプログラムのソースを教えてください。

  • 終了するプロセス名の取得方法

    使用言語はC#です。 System.Diagnostics.Process[] ps = System.Diagnostics.Process.GetProcesses(); for (int i = 0; i<= ps.Length-1 ; i++) {   if (ps[i].MainWindowTitle != string.Empty) {   Console.WriteLine("ウィンドウタイトル:" + ps[i].MainWindowTitle);     Console.WriteLine("起動時間:" + ps[i].StartTime); }   try {     ps[i].EnableRaisingEvents = true; ps[i].SynchronizingObject = this; ps[i].Exited += new EventHandler(p_Exited); if(ps[i].MainWindowTitle != string.Empty) {       Console.WriteLine("ウィンドウタイトル: " + ps[i].MainWindowTitle);       Console.WriteLine("終了時間:" + ps[i].ExitTime); } 現在このようにしてウィンドウのタスクバー上に表示されるプロセスのタイトルを取得し、プロセスが終了したときに同じようにウィンドウのタイトルを表示しようとしました。 起動時のプロセスは取得できるのですが、終了時のプロセスが取得できません。 プロセスを全取得して、比較して終了したプロセスを判断すると終了時刻が取れないように思えるので、プロセスが終了するたびにイベントハンドらにとばすようにしたいです。ご存知の方がいましたよろしくお願いします。

  • C言語をどうしたら?

    学校でC言語を習っています。 そして学校ではC言語を確かビュジアルネットというソフトにソースファイルなどを入れてプログラムを練習しているのですが、家でも練習したいのでどうしたらいいか教えてください。できましたらフリーソフトとその使い方を教えてくださるとうれしいです。 そして、いつかは他のパソコンでもそれが体験できるようにしたいので、その場合の方法も教えてください。

専門家に質問してみよう