我正在尝试使用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秒(看起来像缓冲区的刷新时间),我确实看到了数据。
答案 0 :(得分:1)
这看起来像在rostopic
实用程序中缓冲。当stdout进入终端时,许多C库都足够聪明,每次写入'\n'
时都会刷新。当stdout进入管道时,库将添加一个大缓冲区。看起来需要30秒才能填满它。
要测试此理论,请在命令行中尝试rostopic hz /topicname | cat
。
没有太多可以做的事情,请参阅this问题。
答案 1 :(得分:-1)
我建议你说一些断言管道不是nullptr。如果它是nullptr,则可能打印出命令,errno和strerror()。