1

プログラムで子プロセスを作成する可能性のあるプロセス (プロセス X としましょう) を作成していますが、子プロセスも作成する可能性があり、プロセス ツリーがいつ終了したか (= すべての子孫が終了したか) を判断できません。

そうするための直接的な Boost アプローチは見つかりませんでした。

私の(防弾ではない)解決策は、リスト内のプロセスXのみから始めて、監視対象プロセスのリストを維持し、システム内のプロセスを定期的に監視し、その親IDがリストにあるプロセスを検出したら、それを追加することでしたプロセス ID もリストに追加します。リスト内のすべてのプロセスが終了したことを示す監視サイクルに到達すると、プロセス ツリーが終了します。

このアプローチの 2 つの主要な問題は次のとおりです。

  1. プロセスが「抜け落ちる」可能性があります。次のフローを検討してください。

    • 監視サイクルが終了し、リストは [X] です。

    • プロセス X はプロセス Y を作成し、プロセス Y は Z を作成して終了します。

    • 監視サイクルが開始されました - プロセス Y
      は終了しているため検出されず、プロセス Y が検出されなかったためプロセス Z も検出されません。

  2. このタイプの監視は、問題 1 で説明したこれらの「スリップ」を最小限に抑えるために非常に頻繁に実行する必要があるため、非常にリソースを消費します。

私のプログラムで使用されるいくつかのコード スニペット:

プロセス X の作成:

m_process = ps::execute(
                                  boost::process::initializers::set_cmd_line(...),
                                  boost::process::initializers::bind_stdout(sink), // route stdout to a sink/pipe
                                  boost::process::initializers::set_env(...),
                                  boost::process::initializers::start_in_dir(...),
                                  boost::process::initializers::throw_on_error());

プロセス X の監視 (単純で不十分なケース):

boost::system::error_code ec;
int tmp = ps::wait_for_exit(m_process,timeout,ec);

重要事項:

  1. 子プロセス (プロセス X) を制御することはできません。また、それが何をするのか、どのプロセスが生成されるのかもわかりません。
  2. 私のソリューションは、Windows と Linux の両方に準拠する必要があります (不可能な場合は、プログラムに OS 固有のコードを含める必要がありますが、これは (今まで) OS に依存していませんでした)。
4

1 に答える 1