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

标签 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。

有人能帮帮我吗?

最佳答案

代码应该可以工作,但我会使用我的 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 字节的行中的数据。

关于c++ - 尝试使用 C++ 在 Linux 上执行命令时被阻止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29209438/

相关文章:

c++ - 不同命名空间中的类方法或字段?

linux - 使用 cifs 挂载

c - 从 NETSTAT 的输出中删除

android - 我可以在常规 Linux 发行版上使用 Android 蓝牙 API 吗?

java - 使用 JNI 时 CryptUnprotectData 返回 false

Java:调用 native 方法给出 "Exception in thread "main"java.lang.UnsatisfiedLinkError"

java - 如果 jobobject 从 JNI 返回到 JAVA,我应该删除 GlobalRef 吗?

php - 从 HHVM C++ 扩展运行 PHP 函数

c++ - 我什么时候应该防止隐式破坏?它是如何工作的?

c++ - CMDIChildWndEx 框架中的 DockPaneLeftOf