答案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
)在输出中列出进程组。