DirectIO方式读写文件,只需在打开文件时选上O_DIRECT选项就行,但必须在所有的include前加上#define _GNU_SOURCE,另外以DirectIO方式读写时,开辟的Buffer必须是系统每页大小的整数倍而且必须移页大小为标准对齐,例如linux2.6下每页是4096byt(函数
char*
getpagesize()),申请的buffer大小只能是4096的整数倍
例子:
(test.c)
#define _GNU_SOURCE
#define
BUFFER_SIZE 8192Int fd = open(“testfile”, O_CREAT | O_RDWR | O_DIRECT);
int pagesize=getpagesize();char*
realbuff=malloc(BUFFER_SIZE+pagesize);int pagesize=getpagesize(); char*alignedbuff=(char*)((((inunsigned) realbuff+pagesize-1)/pagesize)*pagesize); write(fd, alignedbuff, BUFFER_SIZE);free(realbuff);申请的地址
realbuff没有对其,经过下面的俩行操作后,alignedbuff是对其的地址,值得注意的是,在施放空间时,要全部释放掉
本文介绍了使用DirectIO方式进行高效文件读写的实现方法,包括如何通过O_DIRECT选项配置文件访问,并详细展示了内存缓冲区的分配及对齐过程,确保与系统页面大小一致。
871

被折叠的 条评论
为什么被折叠?



