打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
open,write等基本系统IO的带缓冲与不带缓冲的差别
userphoto

2014.07.29

关注

转自:http://hi.baidu.com/operationsystem/blog/item/69461bfbe24c8a9f58ee9042.html

带缓存的文件操作是标准C 库的实现,第一次调用带缓存的文件操作函数时标准库会自动分配内存并且读出一段固定大小的内容存储在缓存中。所以以后每次的读写操作并不是针对硬盘上的文件直接进行的,而是针对内存中的缓存的。何时从硬盘中读取文件或者向硬盘中写入文件有标准库的机制控制。

        不带缓存的文件操作通常都是系统提供的系统调用,更加低级,直接从硬盘中读取和写入文件,由于IO瓶颈的原因,速度并不如意,而且原子操作需要程序员自己保证,但使用得当的话效率并不差。另外标准库中的带缓存文件IO 是调用系统提供的不带缓存IO实现的。

“术语不带缓冲指的是每个read和write都调用嗯内核中的一个系统调用。所有的磁盘I/O都要经过内核的块缓冲(也称内核的缓冲区高速缓存),唯一例外的是对原始磁盘设备的I/O。既然read或write的数据都要被内核缓冲,那么术语“不带缓冲的I/O“指的是在用户的进程中对这两个函数不会自动缓冲,每次read或write就要进行一次系统调用。”--------摘自<unix环境编程>

        程序中用open和write打开创建并把“hello world“写入文件test.txt,相应用fopen和fwrite操作文件test2.txt。程序执行到open和fopen之后,sleep 15秒,这时用ls查看生成了文件没,这时用open打开的test.txt出现了,但是fopen的test2.txt没有;当程序执行完write和fwrite之后,fopen的test2.txt仍然没有出现(还是用ls查看),再用cat看test.txt,可以看到 “helloworld”;最后再关闭test.txt和test2.txt,这时test2.txt出现了,并且其内容也是“hello world“。
        该例子证明了open和write是不带缓冲的,即程序一执行其io操作也立即执行,不会停留在系统提供的缓冲里,不需等到close操作完才执行。与之相比的fopen和fwrite则是带缓冲的,(一般)要等到fclose操作完后才会执行。
  
相关的源码示例如下:
#i nclude <unistd.h>
#i nclude <iostream>
#i nclude <fcntl.h>
#i nclude <string>
#i nclude <sys/types.h>
#i nclude <sys/stat.h>
using namespace std;

int main(){
int fd;
FILE *file;
char *s="hello,world\n";
if((fd=open("test.txt",O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR))==-1){
   cout<<"Error open file"<<endl;
   return -1;
}
if((file=fopen("test2.txt","w"))==NULL){
cout<<"Error Open File."<<endl;
   return -1;
}
cout<<"File has been Opened."<<endl;
sleep(15);
if(write(fd,s,strlen(s))<strlen(s)){
   cout<<"Write Error"<<endl;
   return -1;
}
if(fwrite(s,sizeof(char),strlen(s),file)<strlen(s)){
   cout<<"Write Error in 2."<<endl;
   return -1;
}
cout<<"After write"<<endl;
sleep(15);
cout<<"After sleep."<<endl;
close(fd);
return 0;
}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
linux 标准IO缓冲机制探究
C++编程对缓冲区的理解 - VC知识库文章
C 文件和IO操作
C语言文件操作之----文件的读写
·C语言排序算法
178 f0602
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服