O_DIRECT选项使用方法

本文介绍了O_DIRECT在文件I/O操作中的应用,详细解释了如何通过该标志绕过系统缓存来直接读写磁盘,包括必要的编译配置、内存对齐要求及文件偏移对齐等关键点。

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

什么问题 root@Archer BN800:/lib/modules/iplatform# echo '{"access_control_mode":"block_li st"}' | tmpcli -o 0x0C11 tmpcli(229:main): Info: [TPIPF]: Enter... tmpcli(248:main): Info: main 248 : options.opcode = 0xc11 tmpcli(264:main): Info: Please input(as playload): tmpcli(266:main): Info: main 266 : rc = 37 tmpcli(272:main): Info: main 272 : stdin_buf = {"access_control_mode":"block_list"} tmpcli(369:main): Info: main 369 : options.opcode = 0xc11, tmpcli->version = 0x0 tmpcli(370:main): Info: main 370 : tmpcli->business_type = 0x1 tmpcli(142:tmp_client_send_packet): Info: tmp_client_send_packet 142 call tmp_client_send send size = 4 tmpcli(147:tmp_client_send_packet): Info: [TPIPF] pPayloadV1 is tmpcli(48:tmp_client_send_direct): Info: tmp_client_send_direct 48 show buffer to be sent, size = 4: tmpcli(38:print_buffer): Info: 01 00 tmpcli(54:tmp_client_send_direct): Info: tmp_client_send_direct 54 Sent packet length = 4 saveconfig() begin saveconfig() end tmpcli(182:tmp_client_recv_direct): Info: tmp_client_recv_direct 182 show packet has been received, len = 4 tmpcli(206:tmp_client_recv_direct): Info: tmp_client_recv_direct 206 show packet has been received, totalLen = 4: tmpcli(38:print_buffer): Info: 01 00 tmpcli(373:tmp_client_assoc): Info: pkt->ctrl_hdr.major_ver = 0x1, pkt->ctrl_hdr.minor_ver = 0x0 tmpcli(142:tmp_client_send_packet): Info: tmp_client_send_packet 142 call tmp_client_send send size = 4 tmpcli(147:tmp_client_send_packet): Info: [TPIPF] pPayloadV1 is tmpcli(48:tmp_client_send_direct): Info: tmp_client_send_direct 48 show buffer to be sent, size = 4: tmpcli(38:print_buffer): Info: 01 00 tmpcli(54:tmp_client_send_direct): Info: tmp_client_send_direct 54 Sent packet length = 4 tmpcli(387:tmp_client_assoc): Info: tmp_client_assoc 387 assoc successfully. tmpcli(939:tmp_client_connect): Info: tmp_client_connect 939 : return 0 tmpcli(377:main): Info: main 377 : options.opcode = 0xc11 tmpcli(796:tmp_client_request): Info: tmp_client_request 796 : self->opcode = 0xc11 tmpcli(487:tmp_client_prepare_request): Info: tmp_client_prepare_request 487 : pPayloadV1 {"access_control_mode":"block_list"} tmpcli(492:tmp_client_prepare_request): Info: tmp_client_prepare_request 492 : self->opcode = 0xc11 tmpcli(416:tmp_client_prepare_general_request): Info: self->version = 0x0 tmpcli(142:tmp_client_send_packet): Info: tmp_client_send_packet 142 call tmp_client_send send size = 61 tmpcli(147:tmp_client_send_packet): Info: [TPIPF] pPayloadV1 is {"access_control_mode":"block_list"} tmpcli(48:tmp_client_send_direct): Info: tmp_client_send_direct 48 show buffer to be sent, size = 61: tmpcli(26:print_buffer): Info: 01 47 tmpcli(26:print_buffer): Info: 01 73 tmpcli(26:print_buffer): Info: 5f 22 tmpcli(38:print_buffer): Info: 62 0a tmpcli(54:tmp_client_send_direct): Info: tmp_client_send_direct 54 Sent packet length = 61 tmpcli(629:tmp_client_sendrecv): Info: tmp_client_sendrecv 629 call tmp_client_recv_packet tmpcli(182:tmp_client_recv_direct): Info: tmp_client_recv_direct 182 show packet has been received, len = 4 tmpcli(206:tmp_client_recv_direct): Info: tmp_client_recv_direct 206 show packet has been received, totalLen = 4: tmpcli(38:print_buffer): Info: 01 00 tmpcli(182:tmp_client_recv_direct): Info: tmp_client_recv_direct 182 show packet has been received, len = 12 tmpcli(206:tmp_client_recv_direct): Info: tmp_client_recv_direct 206 show packet has been received, totalLen = 12: tmpcli(38:print_buffer): Info: 00 6c tmpcli(282:tmp_client_recv_packet): Info: size = 0x8 tmpcli(182:tmp_client_recv_direct): Info: tmp_client_recv_direct 182 show packet has been received, len = 8 tmpcli(206:tmp_client_recv_direct): Info: tmp_client_recv_direct 206 show packet has been received, totalLen = 8: tmpcli(38:print_buffer): Info: 01 00 tmpcli(301:tmp_client_recv_packet): Info: [TPIPF] payload is = {"access_control_mode":"block_list"} tmpcli(330:tmp_client_recv_packet): Info: Get pkt->business_hdr.ver = 0x1 tmpcli(341:tmp_client_recv_packet): Error: Received TMP packet with business error code 01 tmpcli(632:tmp_client_sendrecv): Error: tmp_client_recv_packet return -1 tmpcli(381:main): Error: tmp_client_request
最新发布
12-12
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值