资源描述:
《Linux学习记录--文件IO操作相关系统编程.pdf》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、文件IO操作相关系统编程这里主要说两套IO操作接口,分别是:POSIX标准read
2、write接口,函数定义在#includeISOC标准fread
3、fwrite接口,函数定义在#include有书上说POSIX标准与ISOC标准的区别在于文件读写是否带缓冲区,我则不是很认同,因此POSIX标准下的IO操作也是带缓冲区的,至于这两个标准下的IO性能谁更加好则不一定,因为这和缓冲区的大小,以及用户逻辑有很大关系。POSIX标准ssize_tread(int__fd,void*__buf,size_t__nbytes)ssize_twrit
4、e(int__fd,constvoid*__buf,size_t__n)读规则:如预读字节数>文件总字节数,则全部读入文件字节数,返回值为文件字节数如预读字节数<文件总字节数,则读满__buf(以__nbytes为准)后返回,下回读取会将继续读如读到文件末尾,则返回值为0比如:文件长度是100,buf长度是70,那么第一个读取70,读2此会读取剩下的30,第三次由于文件游标已经处于文件末尾,则返回0写操作1#include2#include3#include4#defineBUFFER_SIZE2005intmain(
5、){6intfd=-1;7if(access("/tmp/iofile",F_OK)){8fd=creat("/tmp/iofile",0777);9}else{10fd=open("/tmp/iofile",O_WRONLY
6、O_APPEND);11}12if(fd==-1){13perror("文件打开错误!");14return-1;15}16charbuf[BUFFER_SIZE];17intval=0,sum=0;18do{19val=read(0,buf,BUFFER_SIZE);20if(val>0){21write(fd,buf,BUFFER_SIZE);2
7、2}else{23break;24}25sum+=val;26}while(1);27printf("写入数据总长度是:%d",sum);28return1;29}读操作1#include2#include3#include4#defineBUFFER_SIZE4005intmain(){6intfd=open("/tmp/iofile",O_RDONLY);7if(fd==-1){8perror("文件打开错误!");9return-1;10}11charbuf[BUFFER_SIZE];12intval=0,s
8、um=0;13do{14val=read(fd,buf,BUFFER_SIZE);15printf("读入数据长度是:%d",val);16if(val>0){17write(1,buf,BUFFER_SIZE);18printf("");19}else{20sleep(1);21}22sum+=val;23}while(1);24return1;25}执行顺序1.执行写操作:tkf@tkf:~/workspace/FileIOWrite/Debug$./FileIOWrite
9、f:~/workspace/FiloIORead/Debug$./FiloIORead读入数据长度是:400读入数据长度是:400读入数据长度是:200读入数据长度是:0……..è由于此时文件游标已经处于文件末端因此,长度是0读入数据长度是:03.再次执行写操作tkf@tkf:~/workspace/FileIOWrite/Debug$./FileIOWrite
10、对于第三步骤,我们也可以通过更改读进程游标的位置(lseek)使其能读到数据IO效率根据书上效率对比试验,当缓冲区大小(buf)等于文件系统块大小时,性能是最佳的。文件系统块大小structstat–>st_blksize查看对于IO操作主要步骤可以理解为:1.内核与系统缓冲区的数据拷贝2.系统缓冲区与用户缓冲区的拷贝举例,用户BUF是10字节,系统缓冲区时4096字节,那么到我们写端将用户BUF数据拷贝被系统缓冲区中,由于系统缓冲区没有填满,因此不会执行IO操作,直到写满或者执行同步操作。对于读来说,文件系统会将