我正在使用 0.5 版Boost.Process
。文档可以在这里找到。我正在使用 Mac OS X Yosemite。
我的问题:我正在将编译作为子进程启动。我想等待该过程完成。
当我的子进程正确编译时,一切正常。
但是当我的子进程没有编译时,我的代码在调用时似乎崩溃了boost::process::wait_for_exit
。
我的用户代码如下所示:
编辑:代码已被编辑以匹配最新、更正确的版本(仍然不起作用)。
s::error_code ec{};
bp::child child = bp::execute(bpi::set_args(compilationCommand),
bpi::bind_stderr(outErrLog_),
bpi::bind_stdout(outErrLog_),
bpi::inherit_env(),
bpi::set_on_error(ec));
bool compilationSuccessful = true;
if (!ec) {
s::error_code ec2;
bp::wait_for_exit(child, ec2);
if (ec2)
compilationSuccessful = false;
}
的内部实现bp::wait_for_exit
:
template <class Process>
inline int wait_for_exit(const Process &p, boost::system::error_code &ec)
{
pid_t ret;
int status;
do
{
ret = ::waitpid(p.pid, &status, 0);
} while ((ret == -1 && errno == EINTR) || (ret != -1 && !WIFEXITED(status)));
if (ret == -1) {
BOOST_PROCESS_RETURN_LAST_SYSTEM_ERROR("waitpid(2) failed");
}
else
ec.clear();
return status;
}
::waitpid
当我的编译命令失败时,之后的代码永远不会到达。显示的错误是:“child has exited; pid: xxxx; uid: yyy; exit value: 1”。
问题:
- 这是一个错误还是我在滥用
boost::process::wait_for_exit
. - 任何避免我遇到的崩溃的解决方法是便携的?