Я пытаюсь запустить команду на Linux и получить результат, и я нашел некоторый код, но когда я его запускаю, я получаю первую строку и то поток блокируется. Вот код:Заблокирован при попытке выполнить команду в Linux с помощью C++
std::string exec_cmd(char const* cmd)
{
std::string result, file;
FILE* pipe {popen(cmd, "r")};
char buffer[256];
while(fgets(buffer, sizeof(buffer), pipe) != nullptr)
{
file = buffer;
result += file.substr(0, file.size() - 1);
}
pclose(pipe);
return result;
}
Например, если я бег команды uname -a
я получить из но fgets
ожидания данных и выполнение застревает там.
Я использую JNI.
Может кто-нибудь мне помочь?
N.B. этот код будет терять символы, если длина строки превышает 256 байт, потому что она всегда отбрасывает последний символ, считанный из канала. –
@LightnessRacesinOrbit, конечно, ваш второй пример должен просто «result + = buffer» вместо двойной копии –
[WFM] (http://coliru.stacked-crooked.com/a/cd35986d65794aa1)! И [вот пример с четкими символами новой строки] (http://coliru.stacked-crooked.com/a/4ef008180e8f10d0) (после исправления ошибочного '-1'). –