为什么 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
值相同。
当进程以“&”开始时, 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
值相同。