为什么 bash 将通过“&”启动的进程置于前台?

Why bash puts process started via '&' to foreground?

当进程以“&”开始时, bash 将新进程短时间置于前台组 然后放置 自己回到前台组。

据我所知,当我们 运行 任何外部 没有“&”后台运算符的命令,shell 创建一个 命令的新进程组并通知终端该进程组现在是 在前台。当我们 运行 使用“&”时,前台进程组不得更改。

我在 linux 上使用了一个 C 程序,它只打印前台进程组和 启动时自己的进程组,然后在睡眠后打印相同的进程。

我得到以下结果:

tcgetpgrp=19981 getpgrp=19981
sleep(5)
tcgetpgrp=11996 getpgrp=19981

在此示例中,11996 是 bash 的 pid。

我只在 运行 作为 (./test&) 和重负载(从不作为 ./test&)时才注意到这种行为。

bash 的行为是否正确?

Bash版本:4.4.12

编辑

按照@Costi 的建议添加了 pid 值:

tcgetpgrp=29148 getpgrp=29148 getpid=29149
sleep
tcgetpgrp=28566 getpgrp=29148 getpid=29149

28566 是 bash

的 pid

(...) 在 bash 中创建子 shell。根据 bash 手册:

(list) list is executed in a subshell environment (see COMMAND EXECUTION ENVIRONMENT below)

我的猜测是您将那个子 shell 的 PID 视为前台进程,而不是 您的 test 命令的 PID。并且子 shell 退出得非常快(在后台触发命令后)。

为了验证这一点,将 getpid 返回的值添加到组合中,并检查它是否与子 shell 中 运行 时的 getpgrp 值相同。