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

时间:2018-05-21 20:55:47

标签: c++11 ros

我正在尝试使用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 / topicname

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

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

2 个答案:

答案 0 :(得分:1)

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

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

没有太多可以做的事情,请参阅this问题。

答案 1 :(得分:-1)

我建议你说一些断言管道不是nullptr。如果它是nullptr,则可能打印出命令,errno和strerror()。