重复访问多个文件时出错

Error while accessing multiple files repeatedly

我有一个 C++ 和一个 Python 代码通过在目录中读取和写入文件相互通信,多次。他们还在读取数据后删除了一些文件。这是在 Ubuntu 17.10.

上完成的

但是,在多次执行此序列(>6000 - 7000 次)之后,我遇到了以下错误:

Couldn't open the directory: Too many open files

此错误消息始终由 C++ 代码传递。

对于 C++ 代码

数据写入使用:

std::string opfilepath("/some/path/");
ofstream opfile;
opfile.open (opfilepath);
opfile<<"some stuff"<<endl;
opfile.close()

目录中的文件数使用以下方法计算:

DIR* dirFile = opendir( path );
int count = 0;
if ( dirFile ) 
{
  struct dirent* hFile;
  errno = 0;
  while (( hFile = readdir( dirFile )) != NULL ) 
  {
     if ( !strcmp( hFile->d_name, "."  )) continue;
     if ( !strcmp( hFile->d_name, ".." )) continue;

     if ( strstr( hFile->d_name, ext.c_str() ))
        count++;
  } 

}
closedir( dirFile );

使用以下方式读取文件:

std::ifstream file("/some/path");
if (file.is_open())
    {
      //do something
    }
file.close();

并使用以下方式删除文件:

boost::filesystem::remove("/some/file.txt")

对于Python代码:

文件使用:

f = open("/some/file.txt", "a")
f.write("some stuff")
f.close()

使用以下方式读取文件:

fp = open(path)
lines = fp.read().splitlines()
fp.close()

并使用以下方式删除文件:

os.remove("/some/path/and/file.txt")

所有文件都以模块化方式打开和关闭,同步似乎不是问题。但我一直看到 打开的文件太多,并且总是在固定次数的迭代之后。

知道为什么会这样吗?

Couldn't open the directory: Too many open files

这意味着您的进程已超过分配给它的最大打开文件参数,请使用 ulimit -a 或 ulimit -n 查看。您的进程可能合法地需要更多的 fd - 如果是这种情况,请增加 ulimit -n 并在相同的 shell 中启动进程,否则请遵循下面提到的。

如果您想查看打开文件描述符的趋势,请使用 ls /proc/<pid>/fd | wc -l 查看它,它将让您深入了解进程如何处理打开的文件。

这个问题看起来像是文件描述符泄漏,因此要轻松解决这个问题,请使用 lsof -p <pid> 查看所有打开的文件,这可以提供有用的提示。

如果没有任何效果,并且问题看起来很复杂,那么使用 valgrind 分析并使用 track-fd=yes 标志,valgrind --track-fds=yes /path/to/cppBin,以查看导致 fd 泄漏的确切堆栈。