У меня есть процесс, который запускает исполняемый файл, который выполняет исполняемую программу, используя системный вызов execve (2)
родительский процесс ожидает, завершение с использованием wait4 (2) системный вызов
Мне нужно знать время и память, используемые приложением, выполняемым дочерним процессом
Я использовал объект (rusage), возвращаемый системным вызовом wait4 (2) чтобы получить значение времени, которое захотелось, но после некоторых исследований я обнаружил, что память, используемая приложением, не может быть достигнута одним и тем же объектом (rusage), так как теперь это не поддерживается сейчас днями
одним из способов было использовать файловую систему/proc и проанализировать статусные или statm-файлы в каталоге/proc/[pid]
, предполагая, что я хотел разобрать/proc/[pid]/status
что Мне нужно в этом файле поле vmdata, которое указывает память, используемую данными в KB
, когда я прочитал файл до завершения дочернего процесса, поле vmdata не отображается «в файле отсутствует»! очевидно, что процесс не закончен !! поэтому я не смог бы точно определить память, используемую для работы с отверстиями
Когда я прочитал файл после завершения дочернего процесса, каталог/proc/[pid] будет удален! Я предположил, что когда процесс будет завершен, данные процесса будут выпущены
пожалуйста !! любая идея решить эту проблему или какие-либо идеи для других способов?
спасибо ...как трассировать память, используемую дочерним процессом после завершения процесса в C
ответ
Поле VmData, по-видимому, существует только для запуска процессов. Я не знаю, почему ты решил, что это не так. Просто запустите grep VmData /proc/$$/status
, и вы увидите его для текущего процесса оболочки.
В вашем вопросе есть три интересных момента. Во-первых, пока выполняется ваш дочерний процесс. Второй - когда он больше не работает, но существует как зомби, а третий - после того, как вы его пожинаете, и он больше не существует. Кажется, вы пропустили очко №2.
Если вы хотите поймать свой процесс, когда он находится в состоянии зомби (т. Е. Он уже вышел, но еще не получен), вам нужно будет найти способ получить уведомление о его завершении без вызова wait
, который будет заставить его исчезнуть. Мой рекомендуемый способ - зарегистрировать обработчик SIGCHLD
. Он будет вызван, когда ваш процесс будет существовать, но не удалит его из системы. В этот момент /proc/pid/status
по-прежнему будет существовать.
К сожалению для вас, VmData
не существует для процессов зомби. Ваши варианты - либо периодически выбирать VmData
, либо останавливать процесс, когда он собирается завершить работу, но еще не сделали этого на практике.
Существует такой способ расы, но это, к сожалению, требует использования немного черного магического ptrace
syscall. Полное объяснение того, как использовать ptrace
, выходит за рамки этого ответа. В двух словах, однако, ваш дочерний процесс, перед вызовом execve
, вызывает ptrace
с аргументом PTRACE_TRACEME
. Затем ваш родительский процесс станет отладчиком вашего дочернего процесса. Он получает уведомление с wait
в любое время, когда ваш дочерний процесс собирается сделать что-то особенное.
Для этого потребуется некоторое воспроизведение с вызовом, но это позволит вам узнать, когда ваш ребенок собирается выйти, но пока этого не сделал.
спасибо Shachar за ваш ответ, который был полезным !! , но не могли бы вы рассказать, почему вы назовете ptrace черной магией и представьте ее «к сожалению» !! –
Задайте вопрос как вопрос для последующих вопросов '-) (отдельный вопрос) –