![进程共享 SID 是否*总是*意味着它们共享 PGID?](https://linux22.com/image/66861/%E8%BF%9B%E7%A8%8B%E5%85%B1%E4%BA%AB%20SID%20%E6%98%AF%E5%90%A6*%E6%80%BB%E6%98%AF*%E6%84%8F%E5%91%B3%E7%9D%80%E5%AE%83%E4%BB%AC%E5%85%B1%E4%BA%AB%20PGID%EF%BC%9F.png)
如果不是,那么什么时候会出现分歧?
(我无法让他们分歧。)
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 系统。