为什么bash通过'&';到前台?

为什么bash通过'&';到前台?,bash,job-control,Bash,Job Control,当流程以“&”开头时, bash将新进程短期放置到前台组 然后是地方 自身返回前台组 据我所知,当我们运行任何外部 命令,则shell将创建 为命令创建新的进程组,并通知终端该进程组现在已关闭 在前景中。使用“&”运行时,前台进程组不得更改 我在linux上使用了一个C程序,它只打印前台进程组和 启动时拥有自己的进程组,然后在睡眠后打印相同的进程组 我得到以下结果: tcgetpgrp=19981 getpgrp=19981 sleep(5) tcgetpgrp=11996 getpgrp=19

当流程以“&”开头时, 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手册:

(列表)列表在子shell环境中执行(请参见下面的命令执行环境)

我猜您正在将子shell的PID视为前台进程,而不是
test
命令的PID。子shell很快就会退出(在后台启动命令之后)

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

您是对的-请参阅OP中的编辑。我使用括号防止作业控制消息打印到终端。在我的程序中,我使用
tcgetpgrp
+
getpgrp
作为调试的一种方式:说
prog
,所有消息将直接发送到终端,而不需要打开日志文件;对于正常操作,说
prog&
,所有消息都将进入日志文件。OP中问题的解决方法是将
getpgrp
更改为
getpid