POSIX系统(3)会立即调用异步shell命令吗?

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

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

执行

 /bin/sh -c 'sh /mydir/some-script.sh &' 

一旦shell返回,系统将立即返回,这将在它启动内壳后立即返回。 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 

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

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

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