exec()如果传递了shell脚本,是否会为每个命令调用fork?

问题描述 投票:0回答:1

对于传递给exec()的shell脚本中的每个命令,它是否在子进程中生成并运行?假设我有一个名为test.sh的shell脚本,其中包含以下内容;

#!/bin/bash

echo Hello
echo There

如果我要在C程序中的test.sh上调用execvp(),我想知道如何处理一系列命令。

对于脚本中的每个命令,在返回到父级并重复执行下一个命令之前,在该命令上是否有一个派生后跟另一个exec调用?

到目前为止,我已经在这个确切的示例上使用了strace。我的发现是,如果我在脚本中添加了两个回显,就不会调用clone()(我相信这相当于分叉吗?),但是如果我这样放置两只单独的猫:

#!/bin/bash

cat file1
cat file2

然后,我在strace中找到两个要克隆的调用。同时,单独跟踪单个cat调用,而不从shell脚本上的execvp调用运行它,不会在strace中产生任何克隆。

我真的很感谢澄清exec调用处理外壳程序脚本的方式。

对于传递给exec()的shell脚本中的每个命令,它是否在子进程中生成并运行?假设我有一个名为test.sh的shell脚本,其中包含以下内容; #!/ bin / bash echo您好echo有...

c shell sh exec strace
1个回答
2
投票

bash shell具有许多内置命令


0
投票

一些命令内置在外壳中,因此它们不需要派生。必须内置实现控制流的所有命令(例如ifwhilecase)。更改Shell进程状态的命令也必须内置,例如cdulimit

© www.soinside.com 2019 - 2024. All rights reserved.