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 是会话领导者,因此它是其进程组中的唯一进程。
属于同一管道的所有命令都位于同一进程组中。