这里有两份代码,都是读1.dat的内容同步写到2.dat。1.dat的内容是1亿个1,大小95.37MB。另:延迟写的速度大概是2s1.利用fcntl函数#include"apue.h"#include #defineBUFFSIZE4096voidset_fl(intfd,intflags);intmain(){intn;charbuf[BUFFSIZE];set_fl(STDOUT_FILENO,O_SYNC);while((n=read(STDIN_FILENO,buf,BUFFSIZE))>0)if(write(STDOUT_FILENO,buf,n)!=n)err_sys("writeerror");if(n<0)err_sys("readerror");exit(0);}voidset_fl(intfd,intflags){intval;if(val=fcntl(fd,F_GETFL,0)<0)err_sys("fcntlF_GETFLerror");val|=flags;if(fcntl(fd,F_SETFL,val)<0)err_sys("fcntlF_SETFLerror");}./a.out<1.dat>2.datreal0m3.080suser0m0.002ssys0m0.174s2.使用O_SYNC打开文件2.dat#include"apue.h"#include #defineBUFFSIZE4096intmain(){intn;charbuf[BUFFSIZE];intfd=open("2.dat",O_WRONLY|O_SYNC);while((n=read(STDIN_FILENO,buf,BUFFSIZE))>0)if(write(fd,buf,n)!=n)err_sys("writeerror");if(n<0)err_sys("readerror");exit(0);}./a.out<1.datreal0m50.386suser0m0.010ssys0m0.706s如果加上O_TRUNC标志,则需要2~3min。(是因为截断文件长度需要很多时间??)APUE上面写ext2文件系统并不支持O_SYNC,所以设置O_SYNC与否在写文件时间基本上没区别。我机器上文件系统是ext4,可能还是不支持O_SYNC?如果真的不支持,但是open(constchar*pathname,O_SYNC)又显著地增加了写时间。这是为什么呢?
UYOU
开满天机
相关分类