Linux kernel Linux内核_write函数在向大文件追加数据时返回EFBIG

Linux kernel Linux内核_write函数在向大文件追加数据时返回EFBIG,linux-kernel,driver,systems-programming,Linux Kernel,Driver,Systems Programming,任务是写入简单字符设备,将写入该设备的所有数据复制到tmp文件中 我使用kernel\u write函数将数据写入文件,在大多数情况下,它的工作都很好。但当输出文件大小大于2.1 GB时,内核写入函数失败,返回值为-27 要写入文件,我使用此函数: void writeToFile(void*buf、size\u t size、loff\u t*offset){ 结构文件*destFile; char*filePath=“/tmp/output”; destFile=filp_open(文件路径

任务是写入简单字符设备,将写入该设备的所有数据复制到tmp文件中

我使用
kernel\u write
函数将数据写入文件,在大多数情况下,它的工作都很好。但当输出文件大小大于2.1 GB时,
内核写入
函数失败,返回值为-27

要写入文件,我使用此函数:

void writeToFile(void*buf、size\u t size、loff\u t*offset){
结构文件*destFile;
char*filePath=“/tmp/output”;
destFile=filp_open(文件路径,O|u create | O|u WRONLY | O|u APPEND,0666);
if(IS_ERR(destFile)| | destFile==NULL){
printk(“无法打开目标文件”);
返回;
}
size\u t res=内核写入(destFile,buf,size,offset);
printk(“%ld”,res);
filp_close(destFile,NULL);
}
如果“/tmp/output”的大小小于2.1 GB,则此函数工作正常

如果“/tmp/output”的大小“>2.1 GB,
kernel\u write
开始返回
-27

我怎样才能解决这个问题

谢谢

您需要使用
O_LARGEFILE
标志启用(LFS)

下面的代码适用于我。很抱歉,我为调试做了一些其他更改,但我在相关行的上方发表了评论

struct file*writeToFile(void*buf,size\t size,loff\t*offset)
{
结构文件*destFile;
char*filePath=“/tmp/output”;
大小;
//在此处添加O_LARGEFILE标志
destFile=filp_open(文件路径,O|u create | O|u WRONLY | O|u APPEND | O|u LARGEFILE,0666);
if(IS_ERR(destFile))
{
printk(“打开错误:”,(长)文件);
返回文件;
}
如果(destFile==NULL)
{
printk(“打开时出错:空”);
返回文件;
}
res=内核写入(destFile,buf,size,offset);
printk(“代码:”,res);
filp_close(destFile,NULL);
返回文件;
}
为了测试它,我创建了一个带有
fallocate-l3g/tmp/output
的文件,然后删除了
O_create
标志,因为它给出了内核权限错误


我应该加上一条免责声明,很多人说内核的文件I/O是一个错误。即使在我自己测试的时候,我也因为愚蠢的错误两次意外地使我的计算机崩溃


或许可以这样做:

这可能是因为您遇到了最大有符号整数。也许看看你能不能把数据分开?不。我手动创建大(2.1GB)/tmp/输出文件。然后尝试通过驱动程序将小数据(2字节)附加到它。kernel_write再次返回-27.27是EFBIG,“文件太大”无法添加到该文件中,这是一篇关于的文章。另外: