更改进程的父进程?

Tim*_*Tim 16 process gnu-screen job-control disown

是否可以更改进程的父进程?如果是,如何?

例如,

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

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

  • 我以为disown在一个进程上改变了进程的父进程,只是因为名字disown暗示了这一点。但我发现这不是真的。

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

Arc*_*ege 15

进程的父进程 id (ppid) 不能在内核之外更改;没有 setppid 系统调用。内核只会在父进程终止后将 ppid 更改为 (pid) 1 - 如果进程没有响应父进程终止的信号。为了做到这一点,该过程需要有忽略各种信号(SIGHUPSIGTERM等等)预先。

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

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