在尝试使用c ++在Linux上执行命令时被阻止

时间:2015-03-23 11:47:13

标签: c++ linux java-native-interface

我正在尝试在linux上运行命令并检索输出,我发现了一些代码,但是当我运行它时,我得到第一行然后线程被阻塞。这是代码:

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 个答案:

答案 0 :(得分: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字节的数据。