実現したいこと
現在質問している以下の質問でいろいろ調べているうちに別の疑問が生まれたので少し変えて質問させていただきます。
https://teratail.com/questions/7dtgt9o444m1ch
自フォームから別のプロセスを起動させ、起動したプロセスやその子孫プロセスすべてをフォーム側で終了させたく、以下のサイトを参照して起動させた親プロセスを終了時に子孫プロセスも終了させる処理を記載しましたが、上手くいきませんでした。
https://qiita.com/kenichiuda/items/3079ab93dae564dd5d17
試しに例に記載のメモ帳の起動と終了に関しては上手くいったので、原因を調べたところ
今回終了させたいexeが以下の挙動をしていました。
①プロセス起動
②起動したプロセスのさらに下層のフォルダにある別のexeを起動
③①で起動したプロセスは終了
このような場合は、親プロセスとなる最初に開いたプロセスが既に終了しているためそのあとに開かれたexeは子孫プロセスには該当しないため、現状のコードでは最終的に実行されているプロセスを終了できないのでしょうか?
また、今回のような場合に最終的に開いたプロセスを、フォーム側で直接指定して終了させる術はあるのでしょうか?
フォーム側でプロセスを起動しなくても、対象exeを指定して、対象のexeが最終的に開いたexeを終了や
フォーム側でプロセスを起動した際に、そのプロセスが最終的に開いたプロセスを補足して保持しておき、終了したいときに終了させる等、方法は何でもよいのでご教示いただきたいです。
ちなみにですが、子孫プロセスを終了させる方法として以下のサイトも参照しましたが、こちらはちょっと難しくてよくわからず実行できませんでした。このサイトのやり方ならできるとかあるのでしょうか?
https://www.meziantou.net/killing-all-child-processes-when-the-parent-exits-job-object.htm
皆様ご教授お願いいたします。
発生している問題・分からないこと
上記をまとめると以下の通りです。
親プロセスとなる最初に開いたプロセスが既に終了している場合、最終的に開かれたプロセスは子孫プロセスには該当しないのか。
上記理由で現状のコードでは終了できないのか。
最終的に開いたプロセスをフォーム側で直接指定して終了させる術はあるのか?
※フォーム側でプロセスを起動しなくても、対象exeを指定して、対象のexeが最終的に開いたexeを終了や
フォーム側でプロセスを起動した際に、そのプロセスが最終的に開いたプロセスを補足して保持しておき、終了したいときに終了させる等、方法は何でもよいです。
知識は疎いので詳しく説明していただけるとありがたいです。
皆様のお知恵をお借りさせていただきたいです。よろしくお願いいたします。
該当のソースコード
C#
1//クラス 2//クラスに関しては長すぎて文字数制限を超えてしまうため以下URLを参照していただきたいです。クラスはそのままコピペして使ってます。 3https://qiita.com/kenichiuda/items/3079ab93dae564dd5d17 4 5//フォーム側の処理 6Process process; 7 8 private void open_Click(object sender, EventArgs e) 9 { 10 process = Process.Start(対象のexe); 11 } 12 13 private void close_Click(object sender, EventArgs e) 14 { 15 using (var job = JobObject.CreateAsKillOnJobClose()) 16 { 17 job.AssignProcess(process); 18 } // notepad.exe killed 19 }
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
最終的に開かれたプロセスが子孫プロセスに該当しないのか、プロセスを終了できない。
補足
C#
visualstudio:Windowsフォーム
現状の対応では、起動したexeのファイルパスを参照して
起動したexeが格納されているフォルダとその下層にあるフォルダ内で実行されているexeを全て終了させるという対応をしていますが、この場合実行されているプロセスを全て参照し、ファイルパスが一致しているかという処理を行っているため、処理に時間がかかるので、時間がかからないように
最終的に開いたプロセスを補足して終了させたいです。