2016-06-25 14 views
0

У меня есть процесс, который запускает исполняемый файл, который выполняет исполняемую программу, используя системный вызов execve (2)

родительский процесс ожидает, завершение с использованием wait4 (2) системный вызов

Мне нужно знать время и память, используемые приложением, выполняемым дочерним процессом
Я использовал объект (rusage), возвращаемый системным вызовом wait4 (2) чтобы получить значение времени, которое захотелось, но после некоторых исследований я обнаружил, что память, используемая приложением, не может быть достигнута одним и тем же объектом (rusage), так как теперь это не поддерживается сейчас днями

одним из способов было использовать файловую систему/proc и проанализировать статусные или statm-файлы в каталоге/proc/[pid]
, предполагая, что я хотел разобрать/proc/[pid]/status
что Мне нужно в этом файле поле vmdata, которое указывает память, используемую данными в KB

, когда я прочитал файл до завершения дочернего процесса, поле vmdata не отображается «в файле отсутствует»! очевидно, что процесс не закончен !! поэтому я не смог бы точно определить память, используемую для работы с отверстиями

Когда я прочитал файл после завершения дочернего процесса, каталог/proc/[pid] будет удален! Я предположил, что когда процесс будет завершен, данные процесса будут выпущены

пожалуйста !! любая идея решить эту проблему или какие-либо идеи для других способов?
спасибо ...как трассировать память, используемую дочерним процессом после завершения процесса в C

ответ

2

Поле VmData, по-видимому, существует только для запуска процессов. Я не знаю, почему ты решил, что это не так. Просто запустите grep VmData /proc/$$/status, и вы увидите его для текущего процесса оболочки.

В вашем вопросе есть три интересных момента. Во-первых, пока выполняется ваш дочерний процесс. Второй - когда он больше не работает, но существует как зомби, а третий - после того, как вы его пожинаете, и он больше не существует. Кажется, вы пропустили очко №2.

Если вы хотите поймать свой процесс, когда он находится в состоянии зомби (т. Е. Он уже вышел, но еще не получен), вам нужно будет найти способ получить уведомление о его завершении без вызова wait, который будет заставить его исчезнуть. Мой рекомендуемый способ - зарегистрировать обработчик SIGCHLD. Он будет вызван, когда ваш процесс будет существовать, но не удалит его из системы. В этот момент /proc/pid/status по-прежнему будет существовать.

К сожалению для вас, VmData не существует для процессов зомби. Ваши варианты - либо периодически выбирать VmData, либо останавливать процесс, когда он собирается завершить работу, но еще не сделали этого на практике.

Существует такой способ расы, но это, к сожалению, требует использования немного черного магического ptrace syscall. Полное объяснение того, как использовать ptrace, выходит за рамки этого ответа. В двух словах, однако, ваш дочерний процесс, перед вызовом execve, вызывает ptrace с аргументом PTRACE_TRACEME. Затем ваш родительский процесс станет отладчиком вашего дочернего процесса. Он получает уведомление с wait в любое время, когда ваш дочерний процесс собирается сделать что-то особенное.

Для этого потребуется некоторое воспроизведение с вызовом, но это позволит вам узнать, когда ваш ребенок собирается выйти, но пока этого не сделал.

+0

спасибо Shachar за ваш ответ, который был полезным !! , но не могли бы вы рассказать, почему вы назовете ptrace черной магией и представьте ее «к сожалению» !! –

+0

Задайте вопрос как вопрос для последующих вопросов '-) (отдельный вопрос) –