c++11 - 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 秒(看起来像缓冲区的刷新时间),我确实看到了数据。
解决方案
这看起来像是在rostopic
实用程序内部进行缓冲。当 stdout 进入终端时,许多 C 库足够聪明,可以在每次'\n'
写入时刷新。当 stdout 进入管道时,库会添加一个大缓冲区。看起来需要 30 秒才能填充它。
要测试这个理论,请rostopic hz /topicname | cat
在命令行中尝试。
能做的不多,请看这个问题。
推荐阅读
- python - ImportError:无法使用 tensorflow 2.2 从“scipy.misc”导入名称“imread”
- java - Eclipselink 向集合中删除和添加元素的问题
- python - NumPy:有没有办法在 ndarray 上执行“移位”?
- javascript - 传单:使用图层在地图上一起显示动态折线
- python - TypeError:使用 lambda 函数的预期字符串或类似字节的对象
- java - 在 Java 中创建和初始化数组。“新”是什么意思?
- python - 如何根据另一个 DataFrame 的列重新排序 DataFrame
- docker - 如何在 docker 容器启动时自动启动 .NET Core 3.1 API?
- python - Python & Pandas 错误 - 系列不明确
- android - 工具栏不显示选项菜单。(科特林代码)