gpt4 book ai didi

android - 使用 O_DIRECT 打开文件时写入错误 : Invalid argument,

转载 作者:太空宇宙 更新时间:2023-11-04 06:21:24 36 4
gpt4 key购买 nike

使用 O_DIRECT 标志写入文件对我来说非常重要。

这是我打开文件的方式:

//Open the file
int fd;
if((fd = open(inFilepath, O_WRONLY | O_CREAT |O_SYNC |O_DIRECT,S_IRUSR|S_IWUSR))<0) {
//Error handling
return;
}

我知道 O_DIRECT 的对齐限制。这就是我使用 calloc 初始化缓冲区的原因:

char *buff = (char *) calloc((size_t) 1,sizeof(char));

if(write(fd,buff,(size_t)1)<1) {
//Error logging
free(buff);
return -1;
}

我得到了 write: Invalid argument 错误。我什至尝试使用更极端的措施,例如 memalign 和 posix_memalign,但它们遇到了问题(memalign 卡住了,而 ARM 处理器缺少 posix_memalign)。

当我注释掉 O_DIRECT 标志时,一切正常(但 I/O 不是直接的,这正是我需要的)。

有人知道为什么会这样吗?如果 O_DIRECT 没有在 Android 中实现,那么它应该在 open() 处失败,而不是在 write() 处;所以我一定是做错了什么!

谢谢-LD

最佳答案

我解决了它(在您的指导下)- 并想发布我的解决方案以防将来有人遇到类似问题。

诀窍在于,使用 O_DIRECT 标志,您需要将内存地址和缓冲区与文件系统的 block 大小对齐(或者至少, block 大小对我有用;扇区没有) .

struct stat fstat;
stat(filepath, &fstat);
int blksize = (int)fstat.st_blksize;
int align = blksize-1;

const char *buff = (char *) malloc((int)blksize+align);
buff = (char *)(((uintptr_t)buff+align)&~((uintptr_t)align));

if(write(fd,buff,(size_t)blksize)<1) {
//Error handling
free((char *)buff);
return -1;
}

我做了两件主要的事情:

  1. 使用 stat() 并访问 st_blksize 属性找到托管我的文件 block 大小的文件系统。
  2. 分配的 align 字节数超过我的需要。然后,我将这些额外的 align 字节添加到指针地址,以便将这些位屏蔽为较低的 block 大小对齐不会让我分配的内存比我想要的少。然后当然你和掩码的位(通过翻转 align 的位创建,这是 blksize-1),瞧 - 你的缓冲区是 blksize-对齐。

另请注意,您写入的数量也必须与 block 大小对齐(至少在我的情况下)。

-LD

关于android - 使用 O_DIRECT 打开文件时写入错误 : Invalid argument,,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34182535/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com