DOBON.NET DOBON.NETプログラミング掲示板過去ログ

インストーラで別プロセスはどこまでできるのでしょうか?

環境/言語:[XP,VS2008,C#,.NET Framework2.0]
分類:[.NET]

皆さん、はじめまして。

インストーラに関する質問があります。

プロセスを起動させて、インストーラが終了するまで待つプログラムを
組みました。
途中でインストーラの中には別プロセスを起動して終了するものがある
ことがわかり、親プロセスが終了したら子プロセスがないか確認して子
プロセスがあるときは子プロセスが終了するまで待つようにしました。

ここで、いくつか疑問がわいてきました。
インストーラは、子プロセスから孫プロセスを起動して子プロセスは終
了することはないのか?
上記のことがあるならインストーラは、無限にプロセス起動可能なのか
どうか?

申し訳ありませんが、ご教示の程、よろしくお願いいたします。
■No25284に返信(かぼす@しおみさんの記事)
> インストーラは、子プロセスから孫プロセスを起動して子プロセスは終
> 了することはないのか?
> 上記のことがあるならインストーラは、無限にプロセス起動可能なのか
> どうか?

  Windowsには、プロセスの親子関係には依存する情報は
  環境変数やセキュリティ情報のみで、プロセスの生死
  には依存しません。

  よって、自身が起動した子プロセスの生死に関して、
  特別なコード(待ち合わせ)を書かないと、その生死
  によっての処理を実現することができません。

  で、子プロセスが孫を起動した場合、当然孫プロセス
  の終了を待ち合わせる機能が子プロセスに『無い』場
  合、子プロセスは終了します。
  その子プロセスの終了を待ち合わせている親がいるな
  らば、孫プロセスが動作していても親プロセスも終了
  します。

  次に無限に起動できるか?
  と言う問いには、『できません』と回答しておきまし
  ょう。

  理由は、メモリは有限であり、プロセスは最低限でも
  必要なメモリを占有する部分があるからです。

  またプロセスが起動するとシステムは管理する為に、
  ハンドルを割り当てます。そのハンドルテーブルの大
  きさも有限なのでハンドルテーブルが満杯になれば、
  起動できません。

※ メモリが無くなるかハンドルテーブルが満杯になる。
  と言う現象は、Windows3.1のころなら簡単に発生した
  事象ですが、32ビットになって以降、昨今のPC事情
  を考えると、なかなかにそういう事象が発生するよう
  な事態を作るのは難しいかと・・・
  ただ発生するかしないか? => 発生します。

以上。
■No25285に返信(オショウさんの記事)
> ■No25284に返信(かぼす@しおみさんの記事)
>>インストーラは、子プロセスから孫プロセスを起動して子プロセスは終
>>了することはないのか?
>>上記のことがあるならインストーラは、無限にプロセス起動可能なのか
>>どうか?
>
>   Windowsには、プロセスの親子関係には依存する情報は
>   環境変数やセキュリティ情報のみで、プロセスの生死
>   には依存しません。
>
>   よって、自身が起動した子プロセスの生死に関して、
>   特別なコード(待ち合わせ)を書かないと、その生死
>   によっての処理を実現することができません。
>
>   で、子プロセスが孫を起動した場合、当然孫プロセス
>   の終了を待ち合わせる機能が子プロセスに『無い』場
>   合、子プロセスは終了します。
>   その子プロセスの終了を待ち合わせている親がいるな
>   らば、孫プロセスが動作していても親プロセスも終了
>   します。
>
>   次に無限に起動できるか?
>   と言う問いには、『できません』と回答しておきまし
>   ょう。
>
>   理由は、メモリは有限であり、プロセスは最低限でも
>   必要なメモリを占有する部分があるからです。
>
>   またプロセスが起動するとシステムは管理する為に、
>   ハンドルを割り当てます。そのハンドルテーブルの大
>   きさも有限なのでハンドルテーブルが満杯になれば、
>   起動できません。
>
> ※ メモリが無くなるかハンドルテーブルが満杯になる。
>   と言う現象は、Windows3.1のころなら簡単に発生した
>   事象ですが、32ビットになって以降、昨今のPC事情
>   を考えると、なかなかにそういう事象が発生するよう
>   な事態を作るのは難しいかと・・・
>   ただ発生するかしないか? => 発生します。
>
> 以上。
■No25287に返信(とっちゃんさんの記事)
操作ミスって、送信されちゃった。。。

プロセスを起動したら待機せずに終了なら、いくらでも作成できます。
リミットはありません。
ただ、現実的には終わりはあるのでどこまで繰り返すかはわからないものの
いずれ終わりには到達します。
ただ、それが理論値無限なのか、理論値有限なのかは現実的な解としては
無限で考慮で問題ないと思います。
インストーラがサブプロセスを起動し続けていずれパンクしてしまうというのは
プログラムの仕様じゃなくてただのバグでしょうし。

ただ、プログラムによっては、インストール後にインストールしたアプリを
起動するものがあります。
特にサービスをインストールするアプリはほぼ100%に近い確率でサービスを立ち上げてしまいます。
もし、インストーラから起動したものを無制限に待機するとした場合、このサービスを待機することになり、シャットダウン(ログアウトではダメ)まで待機を続けることになります。

なので、現実的な面を考えて待機を検討するのがよいと思いますよ。
オショウさん、とっちゃんさん
丁寧な解説、ありがとうございました。

>理由は、メモリは有限であり、プロセスは最低限でも
>  必要なメモリを占有する部分があるからです。
メモリのことをすっかり忘れていました。
確かに無限には無理ですね。ありがとうございました。

インストーラの終了を待つのは、完璧に対応するのは難しそうなので、
子プロセスまでなら待てるという制限にしようと思います。

本当に、ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板