Как получить код выхода процесса Boost? - PullRequest
0 голосов
/ 17 мая 2018

Мне интересно, как получить код выхода моего дочернего процесса.Функция exit_code () всегда возвращает 0, не имеет значения, завершена (отправьте SIGKILL) или правильно завершена.

Я использую boost ver 1.65 и C ++ 0x.Я не могу изменить эти настройки.

Как я прочитал в документации:

int exit_code () const;

Получить код выхода.Возвращаемое значение не имеет никакого значения, если дочерний элемент не ожидался или был прерван.

Так что эта функция мне не помогает, но я мог бы использовать код ошибки.

std::error_code ec;
bp::system("g++ main.cpp", ec);

Но std :: error_code поддерживается только с c ++ 11.Я пробовал boost :: system :: error_code, но это не правильно.

Здесь ссылка на Boost :: process: https://www.boost.org/doc/libs/1_65_0/doc/html/boost_process/tutorial.html

Есть идеи, как получить этот код выхода?

1 Ответ

0 голосов
/ 17 мая 2018

Вы можете получить код выхода, просто проверив возвращаемое значение:

int ec = bp::system("g++ main.cpp");

Перегрузка, принимающая std::error_code, предназначена только для обработки граничного случая g++, не существующего впервое место (чтобы он никогда не запускал исполняемый файл, и поэтому нет кода выхода).Если вы не используете эту функцию, вместо этого она выдаст исключение при сбое. 1

try {
    int ec = bp::system("g++ main.cpp");
    // Do something with ec
} catch (bp::process_error& exception) {
    // g++ doesn't exist at all
}

Более чистый способ сделать это - сначала разрешить g++ самостоятельно, выполнив поискпеременная окружения $PATH (точно так же, как ваша оболочка):

auto binary_path = bp::search_path(`g++`);
if (binary_path.empty()) {
    // g++ doesn't exist
} else {
    int ec = bp::system(binary_path, "main.cpp");
}

1 Обратите внимание, однако, что C ++ 0x равен C++ 11, непосредственно перед тем, как она была формально стандартизирована, и вполне вероятно, что ваша стандартная библиотека будет поддерживать std::error_code, даже если вы скажете ей использовать C ++ 0x.

...