Boost.Process wait_for_exit(child):崩溃?

时间:2016-01-29 11:55:38

标签: c++ macos boost pid boost-process

我使用的是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”。

问题:

  1. 这是一个错误还是我误用boost::process::wait_for_exit
  2. 避免崩溃的任何解决方法我都是可移植的吗?

2 个答案:

答案 0 :(得分:0)

只是查看你的代码,第一件让我感到震惊的是你实际上没有测试“ec”变量,该变量说明在调用wait_for_exit()之后execute()是否成功。如果你使用无效的子进程调用wait_for_exit(),那么它会崩溃是完全可以理解的。

首先在调用wait_for_exit()之前检查“ec”。

答案 1 :(得分:0)

所以问题是Boost.Test以某种方式修改了信号堆栈。

此信号堆栈修改与Boost.Process进行交互,无法可靠地测试代码,至少在默认的Boost.Test配置中。

我用正常的主要功能和一些功能重写了测试,并完成了这项工作。