Я создаю в своей программе процесс (скажем, процесс X), который может создавать дочерние процессы, и они могут делать то же самое, и мне трудно определить, когда дерево процессов завершено (= все потомки вышли).
Я не нашел для этого никакого прямого подхода к Boost.
Мое (не пуленепробиваемое) решение заключалось в том, чтобы поддерживать список отслеживаемых процессов, начиная только с процесса X в списке, и периодически отслеживать процессы в системе, а при обнаружении процесса - это родительский идентификатор. находится в списке, добавьте этот идентификатор процесса в список. как только я перехожу к циклу мониторинга, который показывает, что все процессы в списке завершены, дерево процессов завершается.
При таком подходе есть две основные проблемы:
Процесс может «ускользнуть» - рассмотрите следующий поток:
Цикл мониторинга завершен, и отображается список [X].
Процесс X создает процесс Y, который создает Z и завершается.
Цикл мониторинга запущен - он не обнаружит процесс Y, поскольку он
завершился, и не обнаружит процесс Z, потому что процесс Y не был обнаружен.
Этот тип мониторинга требует значительных ресурсов, так как он должен запускаться очень часто, чтобы свести к минимуму эти «промахи», описанные в проблеме 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);
Важные примечания:
- У меня нет контроля над дочерним процессом (процесс X), и я не знаю, что он собирается делать или какие процессы он будет порождать.
- Мое решение должно соответствовать как Windows, так и Linux (если это невозможно, мне пришлось бы прибегнуть к использованию кода, специфичного для ОС, в моей программе, которая (до сих пор) не зависела от ОС).