写入错误。无效参数,当文件以O_DIRECT打开时

 2023-01-20    346  

问题描述

对我来说,写入O_DIRECT flag的文件非常重要.

这就是我打开文件的方式:

写入错误。无效参数,当文件以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标志,您需要将内存地址和缓冲区对齐到文件系统的块大小(或者至少,块大小对我有用;扇区都没有).

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属性.
  2. 分配的align比我需要更多的字节.然后,我将这些额外的align字节添加到指针地址中,以便将块掩盖到较低的块大小对齐中不会使我的内存分配的少于我想要的.当然,您和带有掩码的位(通过翻转align的位为blksize -1的位创建),然后voila-您的缓冲区为blksize -Aligned.

还要注意,您写的金额也必须对齐块大小(至少在我的情况下).

-ld

在这种情况下,

其他推荐答案

calloc不会使内存足够好.分配比您需要的更多的内存,然后将其舍入到下一个4K左右的页面.还可以在o_direct中读取下面的笔记以进行open().

以上所述是小编给大家介绍的写入错误。无效参数,当文件以O_DIRECT打开时,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/25983.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。