2

当一个进程以“&”启动时,bash 将新进程放置到前台组一小段时间,然后将自己放回前台组。

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

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

我得到以下结果:

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

在本例中,11996 是 bash 的 pid。

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

bash 的行为是否正确?

重击版本:4.4.12

编辑

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

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

28566 是 bash 的 pid

4

1 回答 1

1

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

(list) list 在子shell环境中执行(见下面的命令执行环境)

我的猜测是您将该子外壳的 PID 视为前台进程,而不是您的test命令的 PID。并且 subshel​​l 很快退出(在后台触发您的命令后)。

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

于 2018-01-04T14:43:18.183 回答