更改进程的父进程?

更改进程的父进程?

是否可以更改进程的父进程?如果是,怎么办?

例如,

  • 如何screen设法将会screen话及其中运行的进程附加到不同的 shell 进程?父进程是否有变化?

  • 我似乎听说过更改程序运行的shell进程的其他方法,但我不记得了。程序的父进程是否也发生变化?

  • 我认为disown一个进程会改变该进程的父进程,仅仅是因为名字disown暗示了这一点。但我发现事实并非如此。

  • Emacs 客户端可以在不同的终端选项卡上连接到 emacs 服务器。父进程是否有变化?

答案1

进程的父进程 ID (ppid) 无法在内核之外更改;没有 setppid 系统调用。内核只会在父进程终止后将 ppid 更改为 (pid) 1 - 如果进程没有响应父进程终止的信号。为此,该过程需要事先忽略各种信号(SIGHUPSIGTERM等)。

screen(1)有一种非常优雅的方式来处理分离和重新连接。当您第一次启动时screen,您实际上正在启动一个用户界面(ui),默认情况下它将创建一个守护程序(会话管理器)。该守护进程没有与之关联的终端、新进程组 ( setpgrp(2))、新会话 ID ( setsid(2))。运行为 的守护进程SCREEN将创建连接到伪终端 ( pty) 的子进程,然后多路复用来自 pty 和 ui ( screen) 的数据。子进程认为它们正在与真实的终端对话。

如果 uiscreen终止,守护进程SCREEN仍将运行、缓冲数据、处理信号、等待新的 ui 等,因为它是不同的进程组并在其自己的会话中。当您使用新的 ui 重新附加时screen,守护进程将像以前一样继续进行多路复用。该守护进程将继续运行,直到所有子进程终止、被杀死、遇到致命错误或主机重新启动。

相关内容