Причина в том, что я хочу получить возвращаемое значение gcc -v через функцию.Как показано на рисунке выше, вы можете подумать, что в оболочке это просто команда, но много поворотов и поворотов тратится впустую. код.
1. Для того, чтобы получить возвращаемое значение командной строки, у меня есть следующая функция:
std::string exec(const char* cmd) {
char buffer[128];
std::string result = "";
FILE* pipe = popen(cmd, "r");
if (!pipe) throw std::runtime_error("popen() failed!");
try {
while (fgets(buffer, sizeof buffer, pipe) != NULL) {
result += buffer;
}
} catch (...) {
pclose(pipe);
throw;
}
pclose(pipe);
return result;
}
2. Отлично, вы можете получить возвращаемое значение ls -l;
3. Попробуйте изменить ifconfig еще раз, он все еще работает;
4. В это время попробуем gcc -v.Эй,машина перевернулась.Хотя распечатка есть,но возвращаемое значение str недоступно.Почему?
5. Попробуйте изменить java -версию, все равно безрезультатно, str не может получить возвращаемое значение;
Позвольте мне упасть в пропасть, я проверял этот код снова и снова, проблем нет... Это потому, что такого рода команды, которые подставляют параметры, не могут получить возвращаемое значение через конвейер? Просидел тут все утро и ничего не получил.Хотел получить через файловый метод и в итоге обнаружил, что это не распространенный способ.В полдень продолжал бороться с этой проблемой,пока не увидел вот эту статью с описанием
В это время я вдруг понял, что после запуска каждой программы в оболочке она открывает как минимум три файловых дескриптора, а именно 0: стандартный ввод; 1: стандартный вывод; 2: стандартная ошибка, не только стандартный вывод, но и стандартная ошибка На этот раз я вернулся и изменил вышеуказанные параметры загрузки, и это действительно полностью решило эту проблему.
g++ -v 2>&1
Java-версия 2>&1