изменение родителя процесса - PullRequest
14 голосов
/ 01 октября 2010

Можно ли изменить родительский процесс?
пример: у родителя A есть ребенок B, могу ли я сделать родителя B процессом Init без убийства A?

Ответы [ 2 ]

15 голосов
/ 01 октября 2010

Вызов ptrace(PTRACE_ATTACH, pid, x, y), где pid - это pid для B (в вашем примере), а x и y не имеют значения (вероятно, установив их в NULL) сделают вызывающий процесс родителем B для многих (но не все) цели (с ограничениями на основе идентификатора пользователя процессов, разумеется, чтобы вы не могли захватить чужие процессы, если вы не являетесь пользователем root).

После вызова ptrace(PTRACE_ATTACH, дочерний элемент все равно получит либо своего исходного родителя, либо pid init в качестве родительского pid из getppid(), но процесс трассировки сможет вызвать wait и получить SIGCHLD из процесса B.

Здесь много чего происходит, поэтому вам следует прочитать man 2 ptrace и убедиться, что вы хорошо понимаете детали.

14 голосов
/ 01 октября 2010

Не извне процесса B.

Внутри процесса B вы можете вызвать fork, который делает копию вашего процесса, а затем позволить исходному завершиться.Когда это происходит, новая копия B2 не будет дочерней по отношению к A, ее родитель будет установлен в 1 (процесс init).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...