为什么bash将流程通过'&'前景?

时间:2018-01-04 14:12:32

标签: bash job-control

使用"&"开始流程时, 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

1 个答案:

答案 0 :(得分:1)

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

  

(list)列表在子shell环境中执行(参见下面的COMMAND EXECUTION ENVIRONMENT)

我的猜测是你看到子shell的PID作为前台进程,你的test命令的PID。子shell很快退出(在后台触发命令之后)。

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