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问题。
我正在尝试通过使用 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问题。