open的O_DIRECT选项
来源:互联网 发布:太仓市司法拍卖淘宝网 编辑:程序博客网 时间:2024/06/02 06:16
#define _FILE_OFFSET_BITS 64 //访问大磁盘
#define _GNU_SOURCE //定义O_DIRECT
#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的文件系统,没法试,不过这也没什么,就按二者大的来吧:-)。
0 0
- open的O_DIRECT选项
- open的O_DIRECT选项
- Linux的O_DIRECT选项
- Linux的O_DIRECT选项
- open参数O_DIRECT的学习
- open : O_DIRECT
- O_DIRECT选项使用方法
- O_DIRECT的作用
- 由open()的O_DIRECT参数引发的公共标准的问题
- InnoDB O_DIRECT选项漫谈(一)
- InnoDB O_DIRECT选项漫谈(二)
- linux open 函数O_DIRECT标志位使用说明
- linux open 函数O_DIRECT标志位使用说明
- open中O_EXCL选项的介绍与分析
- 再议O_DIRECT, O_DIRECT与logical_block_size
- 被open出来的的窗口给父窗口的选择框增加选项
- O_DIRECT初认识
- cifs nfs mount O_DIRECT
- ETL架构设计
- linux:查看内核锁
- StringUtils 工具类的常用方法
- 对动态生成的表格加CSS样式(通过匹配ID的公用部分实现)
- Flexsim常见问题记录
- open的O_DIRECT选项
- uva 1449 Dominating Patterns(ac自动机)
- rman备份script
- iOS中new与alloc/init的区别
- 数据结构学习笔记16——查找的基本概念
- iframe与form的target简单应用
- maven android
- 玩博弈游戏,赢免费游西沙资格
- TypedArray和obtainStyledAttributes使用