fopen 在创建大量文件后因 EFBIG "File too large" 而失败

fopen fails with EFBIG "File too large" after creating a lot of files

本文关键字:File too large 失败 EFBIG 创建 文件 fopen      更新时间:2023-10-16

>我正在创建一个程序,该程序根据某些输入创建小文件(8 KB(,因此它是这样的

#include <iostream>
#incclude <string.h>
#include <errno.h>
void func()
{
const char * file_name = NULL;
// we get file_name from somewhere , ex : pic.png
FILE * fp = fopen();
if (fp == NULL)
{
std::cout << "failed to open file , " << strerror(errno) << std::endl ;
return 0;
}
// some code to deal with the file
}

我创建了很多文件(大约 420 万个,我正在尝试测试性能( 它总是在相同的数字上产生EFBIG错误(文件太大( 虽然我每次都在创建新的唯一文件。

这些文件是在 8 线程中创建的。

对此有任何解释的想法吗?

我想澄清一下,显然这不是确切的代码,但是您可以认为此函数在8个线程中以高频率运行,直到生成该错误为止,并且从该点到程序完成为止,还会为所有文件生成此错误

我实际上无法在任何地方找到 Linux 的文档,但由于您的文件数量显然已达到最大 32 位无符号整数 (4,294,967,295(,听起来您的文件系统无法在一个目录中处理超过这么多文件。错误"太大"实际上是指目录,而不是您尝试打开的文件。

这是一个疯狂的文件数量在一个目录中。只需将它们拆分到不同的目录中即可。

另外,请注意不要一次打开大量文件句柄;您的操作系统将对此施加限制(您可以与ulimit -a一起检查(。但是,当您耗尽此供应时,您应该得到EMFILE