c++ popen 使应用程序暂停 30 秒

c++ popen makes the application to halt for 30 seconds

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

这会使应用程序卡在 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 /topicname

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

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

我建议你坑一些断言 pipe 不是 nullptr。如果它是 nullptr,那么可能会打印出命令、errno 和 strerror()。

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

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

能做的不多,请看this问题。