打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
direct IO

关于O_DIRECT && aio

作者[weylan] 发表于[2007-5-18 16:43:00]
#define _FILE_OFFSET_BITS 64 //访问大磁盘
#define _GNU_SOURCE //定义O_DIRECT

#i nclude <fcntl.h>
 

open的O_DIRECT选项- -

                                      

一个客户的技术支持。
问题的背景是他们希望系统掉电时,损失最小。而用O_DIRECT选项,则文件buffer/cache的机制造成的数据丢失将最小。可是现在问题是DIRECT open一个文件没问题,读/写不正确。

察看open的man page,注意到关于DIRECT选项的一些说明:

Under Linux 2.4, transfer sizes, and the alignment of user
buffer and file offset must all be multiples of the logical block size of the file system....

大概是说,DIRECT的前提必须是buffer地址/传送数据大小都要求"文件系统逻辑块"大小对齐。也就是说,如果我的文件系统逻辑块是4096byte,那么buffer的地址必须是4096的整数倍,每次读写的字节数、offset也是这样。
于是作了一下尝试,我的文件系统逻辑块是4096(大多数都是这样),用这个命令可以查到:

#dumpe2fs /dev/sda6|grep -i "block size"
... 4096

现在主要是解决buffer的地址4096对齐的问题,用gcc的编译选项定义全局变量buffer:
typedef char _aligned_char __attribute__ ((aligned (8192)));
_aligned_char buffer[8192];

这样,全局定义的buffer就会按照4096对齐分配了,nm/objdump都可以看到,也可以在程序中打出来看看:
printf("buffer=%x\n",buffer);

这回写一下:
len=write(fd,buffer,4096);

len的返回值是4096,证明修改是正确的,当然,还要验证一下:
去掉buffer的align选项,编译运行,perror write的结果:
len=write(fd,buffer,4096);
perror("erro");

出现:
erro: Invalid argument


证明align起作用了。

问题倒是临时解决了,不过还是有问题,google O_DIRECT,很多说法不太一样,有的说要page size align,有的说logical block align,现在没有一个块大小是1024的文件系统,没法试,不过这也没什么,就按二者大的来吧:-)。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
GIT初始版源码解析
C语言函数fread() , fwrite() ,fseek()用法分析
Linux下基于TCP的文件传输
C语言安全文件传输程序设计。
linux inotify的使用
编写自己的“ cp ”指令(支持空洞文件)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服