Отслеживать создание дочерних процессов с помощью Boost
Я создаю процесс (скажем, процесс X) в моей программе, который может создавать дочерние процессы, и они также могут это делать, и у меня возникают проблемы с определением того, когда дерево процессов завершило работу (= все потомки вышли).
Я не нашел прямого подхода Boost для этого.
Мое (не пуленепробиваемое) решение состояло в том, чтобы вести список отслеживаемых процессов, начиная только с процесса X в списке, и периодически отслеживать процессы в системе, а при обнаружении процесса, в котором присутствует его родительский идентификатор, добавить, что Идентификатор процесса в список. как только я попадаю в цикл мониторинга, который показывает, что все процессы в списке завершены, дерево процессов завершается.
2 основных проблемы с этим подходом:
Процесс может "ускользнуть" - рассмотрим следующий поток:
Цикл мониторинга завершен, и список равен [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 (если это невозможно, мне придется прибегнуть к тому, чтобы в моей программе был специфический для ОС код, который (до сих пор) не зависел от ОС).
1 ответ
Если вы можете изменить дочерние процессы, чтобы сообщать о PID, которые они создают, используя какой-либо механизм IPC (стандартный вывод, очередь сообщений, общая память, именованный канал...), тогда у вас есть начало.
Вы можете использовать Boost Asio с полученными ручками (object_handle
).
В противном случае вы, вероятно, будете связаны с отладкой ориентированных интерфейсов (которые требуют повышенных разрешений), таких как
Ptrace на Linux (см., например,
PTRACE_EVENT_VFORK
здесь http://man7.org/linux/man-pages/man2/ptrace.2.html)Windows: ожидание процессов внука в Windows
Я бы посоветовал, если вы контролируете дочерние процессы, вам гораздо лучше координировать работу с помощью IPC