我使用的是Boost.Process
版本0.5。可以找到文档here。我使用的是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
之后的代码。显示的错误是:“孩子已退出; pid:xxxx; uid:yyy;退出值:1”。
问题:
boost::process::wait_for_exit
。答案 0 :(得分:0)
只是查看你的代码,第一件让我感到震惊的是你实际上没有测试“ec”变量,该变量说明在调用wait_for_exit()之后execute()是否成功。如果你使用无效的子进程调用wait_for_exit(),那么它会崩溃是完全可以理解的。
首先在调用wait_for_exit()之前检查“ec”。
答案 1 :(得分:0)
所以问题是Boost.Test
以某种方式修改了信号堆栈。
此信号堆栈修改与Boost.Process
进行交互,无法可靠地测试代码,至少在默认的Boost.Test
配置中。
我用正常的主要功能和一些功能重写了测试,并完成了这项工作。