Boost.Process wait_for_exit(child): 崩溃?
Boost.Process wait_for_exit(child): crash?
我正在使用 Boost.Process
的 0.5 版。可以找到文档 here。我正在使用 Mac OS X Yosemite.
我的问题:我将编译作为 child 进程启动。我想等待进程完成。
当我的 child 进程正确编译时,一切正常。
但是当我的 child 进程 没有编译 时,我的代码似乎在调用 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
。
- 是否有任何可移植的避免崩溃的解决方法?
看看你的代码,让我印象深刻的第一件事是你实际上并没有测试 "ec" 变量,它表明 execute() 是否成功,直到你调用 wait_for_exit ().如果您使用无效的子进程调用 wait_for_exit(),它会崩溃是可以理解的。
首先在调用 wait_for_exit() 之前检查 "ec"。
所以问题是 Boost.Test
以某种方式修改了信号堆栈。
此信号堆栈修改与 Boost.Process
交互,并且无法可靠地测试代码,至少在默认 Boost.Test
配置中是这样。
我用普通的 main 和一些函数重写了测试,它完成了工作。
我正在使用 Boost.Process
的 0.5 版。可以找到文档 here。我正在使用 Mac OS X Yosemite.
我的问题:我将编译作为 child 进程启动。我想等待进程完成。
当我的 child 进程正确编译时,一切正常。
但是当我的 child 进程 没有编译 时,我的代码似乎在调用 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
。 - 是否有任何可移植的避免崩溃的解决方法?
看看你的代码,让我印象深刻的第一件事是你实际上并没有测试 "ec" 变量,它表明 execute() 是否成功,直到你调用 wait_for_exit ().如果您使用无效的子进程调用 wait_for_exit(),它会崩溃是可以理解的。
首先在调用 wait_for_exit() 之前检查 "ec"。
所以问题是 Boost.Test
以某种方式修改了信号堆栈。
此信号堆栈修改与 Boost.Process
交互,并且无法可靠地测试代码,至少在默认 Boost.Test
配置中是这样。
我用普通的 main 和一些函数重写了测试,它完成了工作。