会话领导者是其组中唯一的进程吗?

会话领导者是其组中唯一的进程吗?

APUE的下图让我想知道:在一个进程会话中,会话领导者的进程组是否只包含会话领导者而没有其他进程?

  • 创建的任何进程都fork()将从其父进程继承相同的进程组和会话。那么会话领导者可以将任意数量的进程分叉到自己的进程组中吗?

  • 例如,shell(当它是会话领导者时)是其进程组中的唯一进程吗?如果是,是否是因为 shell fork 子进程时,子进程最初与 shell 处于同一进程组,但随后通过调用立即启动一个新的进程组setpgid()

谢谢。

在此输入图像描述

答案1

不,没有这样的限制。如果是这种情况,不实现作业控制的命令(实际上,只有 shell 实现)将无法在启动时分叉进程(因为子进程继承进程组)xterm -e that-command

即使会话领导者是启用了作业控制的交互式 shell,您也可以在其组中拥有其他进程。

跑步:

xterm -e 'sleep 1000 & exec zsh'

在那xterm

  PID  PGID   SID TTY          TIME CMD
14003 14003 14003 pts/20   00:00:00 zsh
14004 14003 14003 pts/20   00:00:00 sleep
14012 14012 14003 pts/20   00:00:00 ps

从交互式 shell 运行的大多数命令都在单独的进程组中运行,但并非所有命令都是如此。

例如,在bash

$ exec 3< <(sleep 1000)
$ ps -j
  PID  PGID   SID TTY          TIME CMD
13913 13913 13913 pts/19   00:00:00 bash
14136 13913 13913 pts/19   00:00:00 bash
14137 13913 13913 pts/19   00:00:00 sleep
14138 14138 13913 pts/19   00:00:00 ps

或者作为提示扩展的一部分启动的进程:

$ PS1=$'$(ps -j)\n$ '
  PID  PGID   SID TTY          TIME CMD
14212 14212 14212 pts/18   00:00:00 bash
14292 14212 14212 pts/18   00:00:00 ps
$ 

答案2

所有外部命令都在与 shell 不同的进程组中运行。 shell 是会话领导者,因此它是其进程组中的唯一进程。

属于同一管道的所有命令都位于同一进程组中。

相关内容