boost::process系统泄漏文件描述符

3

看起来 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

1
我在我的机器上(fedora25)执行了代码,我没有看到你提到的任何文件描述符泄漏,你是使用root权限运行程序吗?你使用的是什么操作系统? - camp0
@camp0,有趣!我正在Arch Linux上运行它,内核版本为5.2.4。我以root权限运行程序,是的。你的boost版本是否与我的匹配? - Jussi Hietanen
我正在运行1.66和g++ 8.3.1,你尝试直接执行“/usr/bin/iptables”了吗?应该很容易确定你代码的问题所在。 - camp0
1
我脑海中唯一想到的是使用valgrind来检查进程并查看哪些文件描述符以识别问题。 - camp0
你也可以访问/proc/$(PID)/fd,并使用ls -la检查哪些文件描述符是打开的。 - schorsch_76
显示剩余3条评论
1个回答

1
问题似乎是在boost的特定版本(1.69)中出现了bug,而不是在发布的代码本身中。因此,升级boost/修补该bug可以解决这个问题。
该bug报告可在此处找到:https://github.com/boostorg/process/issues/62

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接