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