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
的调用阻塞直到进程终止。