首页 > 解决方案 > c++ popen 使应用程序停止 30 秒

问题描述

我正在尝试通过使用 popen 和返回恒定输出行流的命令来解析流。

这会使应用程序卡在fgets()通话中。

这是方法:

std::string MyClass::InvokeCmd(std::string command)
{
    std::string result;
    std::array<char, 128> buffer;
    FILE *pipe = popen(command.c_str(), "r");

        while (fgets(buffer.data(), 128, pipe) != NULL)
        {
            result += buffer.data();
        }
    }
    pclose(pipe);
    return result;
}

该命令是一个 ROS 命令:

rostopic hz /主题名

该命令连续运行并大约每秒产生一行输出。

如果我等待大约 30 秒(看起来像缓冲区的刷新时间),我确实看到了数据。

标签: c++11ros

解决方案


这看起来像是在rostopic实用程序内部进行缓冲。当 stdout 进入终端时,许多 C 库足够聪明,可以在每次'\n'写入时刷新。当 stdout 进入管道时,库会添加一个大缓冲区。看起来需要 30 秒才能填充它。

要测试这个理论,请rostopic hz /topicname | cat在命令行中尝试。

能做的不多,请看这个问题。


推荐阅读