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