对我来说,使用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不是直接的,这正是我需要的)。
有人能解释一下为什么会发生这种情况吗?如果Android没有实现“O_DIRECT”,那么它应该在“open()”阶段失败,而不是在“write()”阶段失败;所以我肯定是做错了什么!
谢谢 -LD
O_DIRECT
时,I/O 大小需要与磁盘文件块大小相同(通常为 4096 字节),并且在页面上对齐(地址可被 4096 整除)。您可能希望查看setbuf()
函数作为可行的替代方案。calloc()
唯一特殊的地方是将分配的内存设置为全部 0x00。malloc、calloc 和 realloc 都返回指向内存块的指针,其地址可被底层硬件总线大小(32 或 64 位)均匀地整除。 - user3629249