0

我正在使用 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”。

问题:

  1. 这是一个错误还是我在滥用boost::process::wait_for_exit.
  2. 任何避免我遇到的崩溃的解决方法是便携的?
4

2 回答 2

0

看看你的代码,让我印象深刻的第一件事是,在你调用 wait_for_exit() 之前,你实际上并没有测试表示 execute() 是否成功的“ec”变量。如果您使用无效的子进程调用 wait_for_exit(),那么它会崩溃是可以理解的。

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

于 2016-01-29T12:09:09.983 回答
0

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

此信号堆栈修改与代码有交互,Boost.Process并且无法可靠地测试代码,至少在默认Boost.Test配置中是这样。

我用正常的 main 和一些函数重写了测试,它完成了工作。

于 2016-01-29T14:58:03.350 回答