在 Linux (Ubuntu 16.04) C++ 上从 Non-terminating 程序连续获取数据
Continuously Get Data from a Non-terminating Program on Linux (Ubuntu 16.04) C++
我的情况是依赖第三方统计调查应用程序;该程序是黑盒的,所以我只能依赖该程序提供的任何输出。
想法是这样的:
- 开始
get_stats
线程
get_stats
调用 stats -p
命令(有点像 popen("...")
)
get_stats
将根据 stats -p
的输出不断更新一些变量集
问题是:提供的统计程序不会终止,所以 popen()
对我不起作用。理想情况下,我希望 get_stats 线程根据统计输出不断更新内部变量。但是,偶尔出现一些延迟(约 1 秒左右)是完全可以接受的。
有没有办法做这样的事情?我假设它是特定于平台的,所以正如标题中提到的,如果你有 solution/idea for Ubuntu 16.04.[= 就好了32=]
编辑:这里有一个更好的 solution 来解决我在 gazebo 方面的具体问题:
gz stats 使用的算法如下:
- 获取
sim_time
和 real_time
(最多 20 个实例)
- 通过
avg(sim_time[0 ~ 20] - sim_time[0])
求平均值 delta_sim
- 重复上面的操作以找到平均值
delta_real
sim_time / real_time = RTF
在 Gazebo GUI 上
注意:我用 avg(...)
来解释算法,但更好的选择是 sum()
。 avg
不是必需的,因为 sim_time
和 real_time
的大小相同。
使用netcat
或socat
、运行后台黑盒应用,连接监听TCP或UDP端口。您需要编写的只是 C/C++ 中的套接字程序,用于处理来自套接字的数据。您可以通过套接字编程处理错误、错误输出、断开连接等。
这可以是 good start:
nc -l -p 1234 -e /path/to/app
因为您说应用程序是 Gazebo,所以您可以使用 libgazebo7-dev
库并从 C/C++ 控制 gazebo,如 here 所述。
我的情况是依赖第三方统计调查应用程序;该程序是黑盒的,所以我只能依赖该程序提供的任何输出。
想法是这样的:
- 开始
get_stats
线程 get_stats
调用stats -p
命令(有点像popen("...")
)get_stats
将根据stats -p
的输出不断更新一些变量集
问题是:提供的统计程序不会终止,所以 popen()
对我不起作用。理想情况下,我希望 get_stats 线程根据统计输出不断更新内部变量。但是,偶尔出现一些延迟(约 1 秒左右)是完全可以接受的。
有没有办法做这样的事情?我假设它是特定于平台的,所以正如标题中提到的,如果你有 solution/idea for Ubuntu 16.04.[= 就好了32=]
编辑:这里有一个更好的 solution 来解决我在 gazebo 方面的具体问题:
gz stats 使用的算法如下:
- 获取
sim_time
和real_time
(最多 20 个实例) - 通过
avg(sim_time[0 ~ 20] - sim_time[0])
求平均值 - 重复上面的操作以找到平均值
delta_real
sim_time / real_time = RTF
在 Gazebo GUI 上
delta_sim
注意:我用 avg(...)
来解释算法,但更好的选择是 sum()
。 avg
不是必需的,因为 sim_time
和 real_time
的大小相同。
使用netcat
或socat
、运行后台黑盒应用,连接监听TCP或UDP端口。您需要编写的只是 C/C++ 中的套接字程序,用于处理来自套接字的数据。您可以通过套接字编程处理错误、错误输出、断开连接等。
这可以是 good start:
nc -l -p 1234 -e /path/to/app
因为您说应用程序是 Gazebo,所以您可以使用 libgazebo7-dev
库并从 C/C++ 控制 gazebo,如 here 所述。