2015-03-23 3 views
1

Я пытаюсь запустить команду на 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.

Может кто-нибудь мне помочь?

+1

N.B. этот код будет терять символы, если длина строки превышает 256 байт, потому что она всегда отбрасывает последний символ, считанный из канала. –

+0

@LightnessRacesinOrbit, конечно, ваш второй пример должен просто «result + = buffer» вместо двойной копии –

+0

[WFM] (http://coliru.stacked-crooked.com/a/cd35986d65794aa1)! И [вот пример с четкими символами новой строки] (http://coliru.stacked-crooked.com/a/4ef008180e8f10d0) (после исправления ошибочного '-1'). –

ответ

1

код должен работать, но я хотел бы использовать мой pstream.h заголовок вместо:

std::string exec_cmd(char const* cmd) 
{ 
    redi::ipstream p(cmd); 
    std::ostringstream result; 
    result << p.rdbuf(); 
    return result.str(); 
} 

Или, если символ новой строки зачистки поведение исходного кода на самом деле желательно:

std::string exec_cmd(char const* cmd) 
{ 
    redi::ipstream p(cmd); 
    std::string result, line; 
    while (std::getline(p, line)) 
     result += line; 
    return result; 
} 

Это будет только сбрасывать символы новой строки, а не терять данные из строк длиной более 256 байт.

+0

a +1 для хорошего кода и предложений, несмотря на то, что технически не ответил на вопрос (что может быть невозможно) –

+0

У меня такая же проблема, я думаю, это потому, что я использую JNI ... –

+0

О, я никогда не пробовал используя трубы или fork/exec с JNI. Я не знаю, как это сделать. –

Смежные вопросы