boost::process 系统泄漏文件描述符
boost::process system leaking file descriptors
似乎 boost::process::system 正在泄漏 fds:
假设我有这个简单的代码每 3 秒刷新一次 iptables 配置(只是一个例子):
#include <boost/process.hpp>
#include <thread>
int main(void)
{
while(true)
{
std::this_thread::sleep_for(std::chrono::seconds(3));
boost::process::system(boost::process::search_path("iptables"), "-F");
}
return 0;
}
如果我通过列表 /proc/PID/fd |wc -l
观察打开文件描述符的计数,我可以看到计数每 3 秒增加 1。最终,当它达到 1024 时,程序将中止,因为 system
调用将抛出一个异常 what()
说明打开的文件 太多!
如何避免这种 fd 泄漏?我正在使用 boost 1.69.
编辑:
将 boost::process::system
替换为 boost::process::child
似乎没有帮助,child
似乎也会泄漏 fds,无论它是否分离。
编辑 2:
使用 --track-fds=yes
的 Valgrind 日志:
https://termbin.com/d6ud
问题似乎是 boost 特定版本 (1.69) 中的错误,而不是发布的代码本身。所以升级boost/patching这个bug解决了这个问题。
可以从这里找到错误报告:https://github.com/boostorg/process/issues/62
似乎 boost::process::system 正在泄漏 fds:
假设我有这个简单的代码每 3 秒刷新一次 iptables 配置(只是一个例子):
#include <boost/process.hpp>
#include <thread>
int main(void)
{
while(true)
{
std::this_thread::sleep_for(std::chrono::seconds(3));
boost::process::system(boost::process::search_path("iptables"), "-F");
}
return 0;
}
如果我通过列表 /proc/PID/fd |wc -l
观察打开文件描述符的计数,我可以看到计数每 3 秒增加 1。最终,当它达到 1024 时,程序将中止,因为 system
调用将抛出一个异常 what()
说明打开的文件 太多!
如何避免这种 fd 泄漏?我正在使用 boost 1.69.
编辑:
将 boost::process::system
替换为 boost::process::child
似乎没有帮助,child
似乎也会泄漏 fds,无论它是否分离。
编辑 2:
使用 --track-fds=yes
的 Valgrind 日志:
https://termbin.com/d6ud
问题似乎是 boost 特定版本 (1.69) 中的错误,而不是发布的代码本身。所以升级boost/patching这个bug解决了这个问题。
可以从这里找到错误报告:https://github.com/boostorg/process/issues/62