Отслеживать создание дочерних процессов с помощью Boost

Я создаю процесс (скажем, процесс X) в моей программе, которая может создать дочерние процессы, и они может сделайте так же, и у меня возникнут проблемы с определением того, когда дерево процессов завершило работу (= вышли все потомки).

Я не нашел прямого подхода Boost для этого.

Мое (не пуленепробиваемое) решение должен был вести список отслеживаемых процессов, начиная только с процесса X в списке, и периодически отслеживать процессы в системе, а при обнаружении процесса, если его родительский идентификатор находится в списке, также добавить этот идентификатор процесса в список. , как только я попадаю в цикл мониторинга, который показывает, что все процессы в списке завершены, дерево процессов завершается.

2 основных проблемы с этим подходом:

  1. Процесс может «ускользнуть» — рассмотрим следующий поток:

    • Цикл мониторинга завершен, и список равен [X].

    • Процесс X создает процесс Y, который создает Z и завершает работу.

    • Начался цикл мониторинга — он не обнаружит процесс Y, так как
      завершен, и он не обнаружит процесс Z, потому что процесс Y был
      не обнаружена.

  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 (если нет
    возможно, мне пришлось бы прибегнуть к использованию кода конкретной ОС в моем
    программа, которая была (до сих пор) независимой от ОС).

1

Решение

Если вы можете изменить дочерние процессы, чтобы сообщать о PID, которые они создают, используя какой-либо механизм IPC (стандартный вывод, очередь сообщений, общая память, именованный канал …), тогда у вас есть начало.

Вы можете использовать Boost Asio с полученными ручками (object_handle).

В противном случае вы, вероятно, будете связаны с отладкой ориентированных интерфейсов (которые требуют повышенных разрешений), таких как

Я бы посоветовал, если вы контролируете дочерние процессы, вам гораздо лучше координировать работу с помощью IPC

1

Другие решения