众所周知,在花括号之间放置一个命令列表会导致列表在当前shell上下文中执行。 没有子shell被创build。 但是在“{}”之后使用“&”时,为什么会创build两个子壳? pid 1002和1003。
{ ./a.out } & sleep 19
当使用“./a.out&”时,只会创build一个子shell。 pid 17358。
./a.out & sleep 19
sed在Linux中replaceASCII字符
Shell脚本 – 查找今天修改的文件,创build目录,并将其移动到那里
Linux:安装后在我的/ bin /或/ usr / bin中找不到expect。 我如何find它?
为什么?
以最小的顺序列出文件
不能设置docker机环境variablesbash
将所有脚本参数复制到另一个variables
C#到单一的GetConsoleWindowexception
我怎样才能把当前运行的Linux进程放在后台?
后台执行列表使用子外壳,因为需要等待该列表的每个成员并运行下一个列表。 在列表背后,父shell需要可用于新的命令; 它也无法管理后台列表。 bash不能一次做超过一件事。 所以,为了使后台清单工作,它运行一个子shell。
请注意,您可以忽略一个后台列表,它将继续运行,显示子shell正在完成其工作:
$ { > sleep 1; sleep 2; sleep 3; sleep 4; sleep 5 > } & $ disown $ ps -f | grep sleep dave 31845 31842 0 03:50 pts/1 00:00:00 sleep 3 dave 31849 31771 0 03:50 pts/1 00:00:00 grep sleep
您甚至可以注销,并且子shell将继续在列表中运行进程。
当您执行单个命令时,不需要子shell,因为shell在运行命令后没有更多工作要做。
在你的例子中,第二个额外的bash子进程,PID 1002,似乎是你正在执行的脚本。 这与列表后台机制无关(至少在概念上) 任何单独的文件中的脚本都有自己的bash过程。
如果一个命令被控制操作符&终止,那么shell会在后台 (或者异步地)在子 shell中执行命令(或者封装在{...}中的命令列表)。
shell不会等待命令完成,返回状态为0。
在C程序中,通过执行fork()然后执行execvp()系统调用来完成。
更新:基于下面的评论和更新的问题。 这是发生了什么事。
当你运行:
./a.out &
BASH直接在后台运行a.out作为运行二进制文件a.out不需要单独的shell进程。
当你运行:
{ ./a.out; } &
BASH必须首先fork和创建一个子shell,因为你可以在{...}里面有一系列命令,然后新分叉的subshell在一个单独的进程中运行a.out 。 所以BASH不是为此创造2个子壳。 只有一个子shell被创建,你看到的第二个pid是a.out 。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。