我有一个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")
以模块化方式打开和关闭所有文件,同步似乎不是问题。但是我总是看到打开的文件太多,而且总是经过固定的迭代次数。
有什么想法可能会发生这种情况吗?
答案 0 :(得分:1)
无法打开目录:打开的文件太多
这意味着您的进程已超出为其分配的最大打开文件参数,请参见使用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泄漏的确切堆栈。