fork and exec in bash

77

如何在bash中实现fork和exec?

假设脚本为

echo "Script starts"

function_to_fork(){
sleep 5
echo "Hello"
}

echo "Script ends"
基本上我希望该函数像在C语言中使用fork和exec调用一样被调用为新进程。
从脚本中可以预期,父脚本将结束,然后等待5秒钟后打印“Hello”。
2个回答

128

像在Shell中一样使用和符号(&)。

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

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

5
这与“fork”并不完全相同。我在C或Ruby中使用fork测试一些命令,它们运行良好。但是像上面这样使用“&”,就会失败。 - user180574
不错,但是... 当我尝试使用函数时,通常会失败。我使用单独的脚本并进行调用。更加灵活。重定向和后台功能更直观,可以更轻松地从命令行进行测试。 - nroose
这个答案所描述的本质上是在后台执行一个子shell。每次调用二进制文件时,"fork()和exec()"就是bash所做的事情。但是这是在前台完成的,会阻塞脚本的执行。当你在子shell中执行此操作时,就可以得到问题所要求的行为。请参阅Bash参考手册的第3.2.3节。 - heine

42

这样怎么样:

(sleep 5; echo "Hello World") &

2
@staticx 的意思是进程会 fork,但父进程在 () 返回之前不会继续执行。 - msanford
@Brian 这个不等我,直接分叉了。 - BryanK
这意味着您要分叉并跟踪返回状态代码(如果需要)。 - Dragonborn
1
当你需要这个时,这确实是你需要的。大多数情况下,你可以只将新进程放到后台运行。但如果你需要将一个复杂的进程放到后台运行,这就非常好用了。 - Bday

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接