1

例如,system("sh /mydir/some-script.sh &")

4

2 回答 2

2

是的,shell 将分叉脚本并立即返回,但您没有简单的方法知道脚本如何以及是否结束。

运行此类异步命令的“正确”方法是对fork(2)您的进程,调用execve(2)子进程并将二进制设置为/bin/sh,其中一个参数设置为脚本名称,并使用waitpid(2)系统定期从父进程轮询子进程调用WNOHANG选项。当waitpid返回 -1 时,您知道脚本已经结束,您可以获取它的返回码。

实际上,system(3)所做的几乎相同,唯一的例外是调用waitpid阻塞直到进程终止。

于 2011-04-14T17:14:47.330 回答
2
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
于 2011-04-14T17:15:55.627 回答