使用"&"开始流程时, 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
答案 0 :(得分:1)
(...)
在bash中创建一个子shell。根据bash手册:
(list)列表在子shell环境中执行(参见下面的COMMAND EXECUTION ENVIRONMENT)
我的猜测是你看到子shell的PID作为前台进程,不你的test
命令的PID。子shell很快退出(在后台触发命令之后)。
要验证这一点,请将getpid
返回的值添加到组合中,并检查在子shell中运行时是否与getpgrp
值相同。