更改流程的父流程?


14

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

例如,

  • 如何screen管理将会话screen及其内部运行的进程附加到不同的Shell进程?上级流程有变化吗?

  • 我似乎听说过其他正在运行程序的Shell进程更改方式,但我不记得了。程序的父进程也有变化吗?

  • 我认为disown某个流程会更改该流程的父流程,只是因为名称disown暗示了这一点。但是我发现这是不正确的。

  • Emacs客户端可以在另一个终端选项卡上连接到emacs服务器。上级流程有变化吗?


disown只是从shell的子进程内部列表中删除给定的子进程。孩子的PPID仍然是外壳的PPID。Shell忘记了它曾经启动过那个孩子,但是内核记住了。
沃伦·杨

流程是否还记得其父级?
蒂姆(Tim)

如果要知道,它将调用getppid(2),系统调用,并且系统调用由内核处理。可以通过发出该调用,保存该值,然后在其父项更改之后使用该值来混淆程序。这里有种族的机会。
沃伦·杨

听起来像是一个有趣的新内核功能。
ChuckCottrill

Answers:


14

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

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

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


谢谢。我添加了“ Emacs客户端可以在另一个终端选项卡上连接到emacs服务器。父进程是否发生变化?”
蒂姆(Tim)

1
每个进程只有一个父进程,直到父进程死亡或死亡。如果死了,那就没有意义了。如果父母去世,则PPID变为1,即init进程。这是父流程唯一的更改-父流程终止时。通过进程间通信(管道,套接字等)进行连接不会影响PPID。
Arcege 2015年

Emacs如何在不同的终端选项卡中将客户端附加到服务器?
2015年

服务器将侦听套接字(通常是UNIX域套接字文件)以等待连接。客户端将在该套接字上打开连接。选项卡与客户端和服务器之间的通信无关,它可以是不同的选项卡,不同的终端仿真(xterm与rxvt与终端),也可以是xemacs。每个客户端都知道要连接的位置,因此它可以在任何地方。
Arcege 2015年

1
父进程ID并不总是变为1。 这种公认的专制已经超过3年了。
JdeBP

-2

我明白。您需要更改内核以编写一些模块来这样做!我认为在某些情况下会很有用。例如,您做了一些长时间的辛苦工作,他们花了一个小时的时间...而当系统无法响应时(在这种情况下,这是通常的情况),您将执行一些不可预知的操作(因为您需要执行操作并且不确定单击鼠标放在正确的位置,这样系统就不能长时间响应)并意外杀死父进程。系统通常会杀死所有儿童!但是,如果子进程为root且仅父进程的顺序用户和操作确实使该顺序用户也成为该顺序用户,则在任何情况下都不会终止该进程!他的父母将使用PID 1进行初始化。系统最后响应后,您要恢复层次结构。但是你不能!!!标准情况下,您以su作为普通用户从终端以root用户身份启动升级系统。为什么?因此,要在控制台上获取所有错误和警告。特别是要升级的实用程序是GUI。他们什么都没有得到……我记得在Windows OS中可以做到这一点。有特殊的WinAPI函数。为什么在Linux中无法做到这一点?还不清楚...这很简单!!!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.