Я использую версию 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».
Вопросы:
boost::process::wait_for_exit
,Просто глядя на ваш код, первое, что меня поражает, это то, что вы на самом деле не тестируете переменную «ec», которая говорит, успешно ли выполняется execute () или нет, пока вы не вызовете wait_for_exit (). Если вы вызываете wait_for_exit () с недопустимым дочерним процессом, вполне понятно, что он завершится сбоем.
Начните с проверки «ec» перед вызовом wait_for_exit ().
Так что проблема была в том, что Boost.Test
модифицирует стек сигналов в некотором роде.
Эта модификация стека сигналов взаимодействует с Boost.Process
и код не может быть надежно проверен, по крайней мере, по умолчанию Boost.Test
конфигурации.
Я переписал тесты с нормальным основным и некоторыми функциями, и он сделал свою работу.