Этот вопрос меня очень заинтересовал. Поэтому я написал некоторый код, чтобы попробовать это.
Во-первых, имейте в виду, что при трассировке процесса трассировка становится родительской для большинства целей, за исключением имени (например, getppid()
). Во-первых, полезен фрагмент раздела PTRACE_ATTACH
руководства:
PTRACE_ATTACH
Attaches to the process specified in pid, making it a traced
"child" of the calling process; the behavior of the child is as
if it had done a PTRACE_TRACEME. The calling process actually
becomes the parent of the child process for most purposes (e.g.,
it will receive notification of child events and appears in
ps(1) output as the child's parent), but a getppid(2) by the
child will still return the PID of the original parent. The
child is sent a SIGSTOP, but will not necessarily have stopped
by the completion of this call; use wait(2) to wait for the
child to stop. (addr and data are ignored.)
Теперь вот код, который я написал для тестирования и проверки того, что вы действительно можете ptrace()
своего родителя (вы можете собрать его, выгрузив его в файл с именем blah.c
и запустив make blah
:
#include <assert.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/ptrace.h>
int main()
{
pid_t pid = fork();
assert(pid != -1);
int status;
long readme = 0;
if (pid)
{
readme = 42;
printf("parent: child pid is %d\n", pid);
assert(pid == wait(&status));
printf("parent: child terminated?\n");
assert(0 == status);
}
else
{
pid_t tracee = getppid();
printf("child: parent pid is %d\n", tracee);
sleep(1); // give parent time to set readme
assert(0 == ptrace(PTRACE_ATTACH, tracee));
assert(tracee == waitpid(tracee, &status, 0));
printf("child: parent should be stopped\n");
printf("child: peeking at parent: %ld\n", ptrace(PTRACE_PEEKDATA, tracee, &readme));
}
return 0;
}
Обратите внимание, что я использую репликацию виртуального адресного пространства родителя, чтобы знать, где искать. Также обратите внимание, что когда дочерний процесс затем завершается, я подозреваю, что существует неявное отсоединение, которое должно позволить родителю продолжить работу, я не стал исследовать дальше.
person
Matt Joiner
schedule
07.02.2010
errno
) после странной ошибки, которую вы видите? - person jschmier   schedule 07.02.2010