例如,system("sh /mydir/some-script.sh &")
答案 0 :(得分:2)
是的,shell将分叉脚本并立即返回,但是你没有简单的方法知道脚本是如何以及是否已经结束。
运行此类异步命令的“正确”方法是fork(2)
您的进程,在二进制设置为execve(2)
的子进程中调用/bin/sh
并设置其中一个参数到您的脚本名称,并使用waitpid(2)
系统调用WNOHANG
选项定期从父级轮询子项。当waitpid
返回-1时,您知道脚本已经结束,您可以获取其返回码。
实际上,system(3)
所做的几乎是相同的,唯一的例外是对waitpid
的调用会阻塞,直到进程终止。
答案 1 :(得分:1)
system("sh /mydir/some-script.sh &")
执行
/bin/sh -c 'sh /mydir/some-script.sh &'
只要外壳返回, system
就会返回,这将在它启动内壳后立即返回。 shell都不会等待some-script.sh
完成。
$ cat some-script.sh
sleep 1
echo foo
$ /bin/sh -c 'sh some-script.sh &' ; echo bar ; sleep 2
bar
foo