如何将进程从一个进程组移动到另一个进程组,以及如何列出每个进程组中的进程?

如何将进程从一个进程组移动到另一个进程组,以及如何列出每个进程组中的进程?

根据我目前了解到的情况,一个终端只有一个会话,一个会话有一个或多个进程组,一个进程组有一个或多个进程。

下图说明了这一点:

在此输入图像描述

我有两个问题:

  1. 如何将进程从一个进程组移动到另一个进程组?
  2. 如何列出每个进程组中的进程?

编辑:我的意思是如何从终端而不是以编程方式完成这两件事。

答案1

从用户甚至典型程序员的角度来看,您不会将进程从一个组移动到另一组。组织进程组是 shell 的工作。当您以交互方式运行作业时,shell 会将其放入其自己的组中。这样做的主要目的是当用户按Ctrl+时杀死整个组(例如管道中的所有进程)C

更一般地说,进程组可以实现的一件事是原子地终止一组进程。如果您尝试列出一些进程然后终止它们,其中一个进程可能在其间分叉。当您终止进程组时,也会终止该组中的所有进程,即使它们正忙于分叉。

作为用户或应用程序程序员,您有时可能想做的一件事是在自己的组中运行新进程。没有用户级命令可以做到这一点。您可以通过启动交互式 shell 来完成此操作。 (看shell脚本超时对于一个复杂的例子。)还有其他命令,例如timeout公用事业来自 GNU coreutils 和 Linux 以及setsid公用事业来自 util-linux 套件,该套件创建一个新的进程组作为其操作的一部分。

将进程移动到不同进程组的系统调用是setpgid。 (还有一个名为 的部分别名setpgrp。)有一些限制:它只能由进程本身或其父进程调用,并且目标组必须与原始组位于同一会话中。您不能随意将进程从一个组移动到另一个组。

没有特定的方法来枚举组中的进程。您所能做的就是枚举所有进程并选择该特定组中的进程。您可以ps通过包含该pgid列(例如ps -e -o pid,ppid,pgid,args)在输出中列出进程组。

相关内容