Изменение родительского процесса
Можно ли изменить родитель процесса?
ex: родительский A имеет дочерний B, я могу сделать родительский элемент B процессом Init, не убивая A?
Ответы
Ответ 1
Не за пределами процесса B.
Изнутри процесса B вы можете вызвать fork, который делает копию вашего процесса, а затем разрешить исходный выход. Когда это произойдет, новая копия B2 не будет дочерним элементом A, ее родительский элемент будет установлен в 1 (процесс init).
Ответ 2
Вызов ptrace(PTRACE_ATTACH, pid, x, y)
, где pid
- это pid из B (в вашем примере), а x и y не имеют значения (возможно, они установлены в NULL) сделают вызывающий процесс родителем B для многих (но не все) цели (с ограничениями, основанными на идентификаторе пользователя процессов, конечно, чтобы вы не перехватили другие процессы, если вы не являетесь root).
После вызова ptrace(PTRACE_ATTACH,
ребенок все равно получит либо исходный родительский, либо init pid в качестве родительского pid из getppid()
, но процесс трассировки сможет вызвать wait
и получить SIGCHLD
из процесса B.
Здесь много чего происходит, поэтому вы должны прочитать man 2 ptrace
и убедиться, что вы хорошо понимаете детали.