是否可以更改流程父级?
例如:父A有子B我可以让B的父亲是Init进程而不杀A?
答案 0 :(得分:15)
调用ptrace(PTRACE_ATTACH, pid, x, y)
其中pid
是B的pid(在您的示例中),x和y无关紧要(可能将它们设置为NULL)将使调用进程成为B的父级许多(但不是全部)目的(基于进程的用户ID的限制,当然,除非你是root用户,否则不要接管别人的进程)。
在调用ptrace(PTRACE_ATTACH,
之后,孩子仍然会从getppid()
获得其原始父级或init的pid作为其父级pid,但跟踪过程将能够调用wait
并获取{来自流程B的{1}}。
这里有很多内容,所以你应该阅读SIGCHLD
并确保你能够很好地理解这些细节。
答案 1 :(得分:14)
不是来自流程B之外。
从进程B内部,你可以调用fork来制作你的进程副本,然后让原来退出。当发生这种情况时,新副本B2将不是A的子节点,其父节点将设置为1(init进程)。