本文主要是介绍O_DIRECT选项使用方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1、使用O_DIRECT的目的:对文件进行直接的IO操作,避免系统缓冲区的影响,一般用于测试自带的缓存系统的效果
2、使用O_DIRECT方法
diskfd = open("/dev/sdb", O_RDWR| O_DIRECT)
error: ‘O_DIRECT’ undeclared (first use in thisfunction)
//说明编译时无法识别O_DIRECT标识符,在源文件顶部加入#define _GNU_SOURCE,或者使用编译选项-D__GNU_SOURCE,实际上是打开_GNU_SOURCE这个宏以便用户使用/usr/include/features.h中的功能。
char *buf = (char *)malloc(BUF_SIZE*sizeof(char));
read(diskfd, buf,BUF_SIZE); //返回实际读取的长度,可能不足BUF_SIZE甚至对齐的大小
read error:invalid argument
//参数buf的问题,必须保证存放文件数据的缓冲区buf的起始位置以及大小必须是磁盘逻辑块大小的整数倍,另外文件的偏移也必须对齐,一般也就是512字节(也有可能是一内存页大小getpagesize(),4096),实际测试为512字节,即扇区的大小。
offset = offset + getpagesize() - offset %getpagesize();
rand() 0-RAND_MAX(2^32-1)
off_t默认为32位,(-2^31 ~ 2^32-1)总共可寻址的空间为4GB,但是测试HDD时需要超过4G的可寻址范围,使用#define _FILE_OFFSET_BITS64或者使用# define__USE_FILE_OFFSET64 1或者编译时使用编译选项-D_ FILE_OFFSET_BITS=64
这篇关于O_DIRECT选项使用方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!