use*_*392 5 shell process process-groups
根据我目前所了解的,一个终端只有一个会话,一个会话有一个或多个进程组,一个进程组有一个或多个进程。
下图说明了这一点:
我有两个问题:
编辑:我的意思是如何从终端而不是以编程方式做这两件事。
从用户甚至典型程序员的角度来看,您不会将进程从一个组移动到另一组。组织进程组是 shell 的工作。当您以交互方式运行作业时,shell 会将其放入其自己的组中。Ctrl这样做的主要目的是当用户按+时杀死整个组(例如管道中的所有进程)C。
更一般地说,进程组可以实现的一件事是原子地终止一组进程。如果您尝试列出一些进程然后终止它们,其中一个进程可能在其间分叉。当您终止进程组时,也会终止该组中的所有进程,即使它们正忙于分叉。
作为用户或应用程序程序员,您有时可能想做的一件事是在自己的组中运行新进程。没有用户级命令可以做到这一点。您可以通过启动交互式 shell 来完成此操作。(有关复杂示例,请参阅shell 脚本中的超时。)还有其他命令,例如GNU coreutils 和 Linux 中的timeout实用程序以及util-linux 套件中的setsid实用程序,它们在操作过程中创建新的进程组。
将进程移动到不同进程组的系统调用是setpgid。(还有一个名为 的部分别名setpgrp。)有一些限制:它只能由进程本身或其父进程调用,并且目标组必须与原始组位于同一会话中。您不能随意将进程从一个组移动到另一个组。
没有特定的方法来枚举组中的进程。您所能做的就是枚举所有进程并选择该特定组中的进程。ps您可以通过包含该pgid列(例如)在输出中列出进程组ps -e -o pid,ppid,pgid,args。