Изменение родительского процесса

Можно ли изменить родитель процесса?
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 и убедиться, что вы хорошо понимаете детали.