Boost.Process wait_for_exit (child): сбой?

Я использую версию 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никогда не достигается, когда моя команда компиляции терпит неудачу. Показанная ошибка: «дочерний процесс завершен; pid: xxxx; uid: yyy; выходное значение: 1».

Вопросы:

  1. Это ошибка или я неправильно использую boost::process::wait_for_exit,
  2. Любой обходной путь для того, чтобы избежать крушения, которое я получаю, является портативным?

0

Решение

Просто глядя на ваш код, первое, что меня поражает, это то, что вы на самом деле не тестируете переменную «ec», которая говорит, успешно ли выполняется execute () или нет, пока вы не вызовете wait_for_exit (). Если вы вызываете wait_for_exit () с недопустимым дочерним процессом, вполне понятно, что он завершится сбоем.

Начните с проверки «ec» перед вызовом wait_for_exit ().

0

Другие решения

Так что проблема была в том, что Boost.Test модифицирует стек сигналов в некотором роде.

Эта модификация стека сигналов взаимодействует с Boost.Process и код не может быть надежно проверен, по крайней мере, по умолчанию Boost.Test конфигурации.

Я переписал тесты с нормальным основным и некоторыми функциями, и он сделал свою работу.

0

По вопросам рекламы [email protected]