进程共享 SID 是否*总是*意味着它们共享 PGID?

进程共享 SID 是否*总是*意味着它们共享 PGID?

如果不是,那么什么时候会出现分歧?

(我无法让他们分歧。)

SID 共享进程还有哪些其他特征总是分享?

答案1

会话包含进程组,进程组又包含进程。

这些主要是为了终端作业控制而创建的。会话通常与终端中的登录会话或终端仿真器中的整个 shell 会话相关联。

当您登录或启动时xterm,将创建一个新进程,该进程启动一个新会话(自动启动一个新进程组),并且该进程(现在既是会话领导者又是进程组领导者)执行您的登录 shell。通过在不使用 O_NOCTTY 的情况下打开终端设备,该进程还会将该终端设备关联到会话(并成为控制过程该终端)。该终端设备成为控制终端该会话中的所有进程。

然后,该 shell 在自己的进程组中运行每个作业(通过分叉一个启动新进程组的进程,并可能最终分叉该组中的其他几个进程(例如,对于像cmd1 | cmd2)这样的管道),并对ioctl()s终端设备执行特殊操作来告诉其中哪个作业位于前台(例如,它们可以对终端进行 I/O 操作并通过 CTRL-C 接收 SIGINT)。

所以,是的,每个会话通常有多个进程组。

例如在交互式 shell 中:

$ sleep 1 | sh -c 'sleep 2; :' & ps -j
[1] 2902 2903
  PID  PGID   SID TTY          TIME CMD
 2902  2902  4648 pts/23   00:00:00 sleep
 2903  2902  4648 pts/23   00:00:00 sh
 2904  2904  4648 pts/23   00:00:00 ps
 2905  2902  4648 pts/23   00:00:00 sleep
 4648  4648  4648 pts/23   00:00:00 zsh

3 个进程组,一组在前台 ( ps),一组在后台,有 3 个进程 ( sleep, sleep, sh) 和我的交互式 shell。

进程组的所有进程都必须位于同一个会话中,因为创建新会话(如果您是进程组领导者则无法执行此操作)会自动创建新进程组。

我推荐阅读

info libc 'Job Control'

有关更多信息,请参阅 GNU 系统。

相关内容