bash中的fork和exec


68

如何在bash中实现fork和exec?

让我们假设脚本为

echo "Script starts"

function_to_fork(){
sleep 5
echo "Hello"
}

echo "Script ends"

基本上,我希望该函数像在C语言中那样被称为新进程,我们使用fork和exec调用。

在脚本中,预期父脚本将结束,然后在5秒钟后打印“ Hello”。

Answers:


117

就像在外壳上一样使用&号。

#!/usr/bin/bash
function_to_fork() {
   ...
}

function_to_fork &
# ... execution continues in parent process ...

3
这与“叉子”并不完全相同。我使用C或Ruby中的fork测试了一些命令,它运行良好。但是像上面那样使用“&”,它会失败。
user180574 2015年

很好,但是...当我尝试使用函数时,我通常会失败。我使用一个单独的脚本并将其命名。功能更多。重定向和后台功能更加直观,可以从命令行更轻松地进行测试。
2014年

澄清措辞:此答案中所描述的实质上是在后台执行子外壳程序。bash每次调用二进制文件时都会执行“ fork()和exec()”。但这是在前台完成的,从而阻止了脚本的执行。在子外壳中执行此操作时,您将获得问题中要求的行为。参见《 Bash参考手册》的3.2.3节。
heine

35

怎么样:

(sleep 5; echo "Hello World") &

2
@staticx表示该进程将派生,但是父级将不会继续执行,直到()返回为止?
msanford 2014年

@Brian这不等我,只是叉子
BryanK '16

这意味着您需要分叉并且还跟踪返回状态代码
Dragonborn

这确实是您需要时所需要的。在大多数情况下,您可以将新流程作为背景。但是,如果您需要为复杂的流程提供背景知识,那就太好了。
Bday
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.