看起来 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秒钟增加一个计数。最终,当达到1024时,程序将会中止,因为system
调用将抛出一个异常,其中what()
表明有太多的打开文件!
我应该如何避免这种fd泄漏?我正在使用boost 1.69。编辑: 用
boost::process::child
替换boost::process::system
似乎并没有帮助,无论是分离还是不分离child
都会泄漏fds。编辑2: 使用
--track-fds=yes
的Valgrind日志:
https://termbin.com/d6ud
/proc/$(PID)/fd
,并使用ls -la
检查哪些文件描述符是打开的。 - schorsch_76