当前位置: 首页 > news >正文

网站开发的推荐参考书百度一下官网入口

网站开发的推荐参考书,百度一下官网入口,郑州网站建设方案php,中山市住房和城乡建设局官网缓冲区的认识 缓冲区(buffer)是存储数据的临时存储区域。当我们用C语言向文件中写入数据时,数据并不会直接的写到文件中,中途还经过了缓冲区,而我们需要对缓冲区的数据进行刷新,那么数据才算写到文件当中。…

缓冲区的认识

缓冲区(buffer)是存储数据的临时存储区域。当我们用C语言向文件中写入数据时,数据并不会直接的写到文件中,中途还经过了缓冲区,而我们需要对缓冲区的数据进行刷新,那么数据才算写到文件当中。而缓冲区通常是一块内存区域,可以是数组、队列、链表等数据结构。

代码举例

int main()
{//C接口FILE* fp=fopen("log.txt","w");//创建文件const char* buffer = "hello buffer\n"; fwrite(buffer,strlen(buffer),1,fp);//文件写入//系统接口close(fp->_fileno);return 0;
}

此时的数据其实就是写进了缓冲区中,但是我们此时的调用接口是不一样的,关闭文件调用的是系统调用接口,而且FILE结构体中是封装了文件描述符的。先认识后续会讲述原因。


其实我们是可以将我们缓冲区中的数据给刷新出来:

int main()
{FILE* fp=fopen("log.txt","w");const char* buffer = "hello buffer\n"; fwrite(buffer,strlen(buffer),1,fp);fflush(fp);//刷新缓冲区close(fp->_fileno);return 0;
}

 为什么要有缓冲区的存在

其实缓冲区的存在就是为了减少对数据的访问次数,当我们输入输出数据的时候,其实就是对文件信息进行交互的(一切皆文件)。我们为了避免每一次的文件访问IO操作,从而会降低效率,所以说可以建立一个像缓冲区这样的中转站,将数据与缓冲区交互,然后将所有的数据都接收处理好了以后再交给文件。

缓冲区的刷新方式

  1. 立即刷新(无缓冲)
  2. 行刷新(行缓冲)
  3. 缓冲区满了刷新(全缓冲)
  4. 强制刷新

一般对于显示器文件的刷新方式是行刷新(\n也是进行行刷新),而一般磁盘上的文件的刷新方式就是缓冲区满了再刷新。 我们也可以通过fflush函数强制的进行刷新缓冲区。而且进程退出后都会采取强制刷新,但是此时如果文件已经close的话(底层fd没了),数据依旧刷不进去的。


此时就可以浅浅的解释我们开始写的代码的,因为我们的一般文件的刷新策略是缓冲区满了才刷新的,这正是因为我们向log.txt这个文件里写的数据没有写满缓冲区,所以导致缓冲区没有刷新,从而该文件中并没有数据。其实如果你多写一些数据进去的话其实是可以写满的。

缓冲区与操作系统无关

 结论我们写代码时的缓冲区其实是属于C语言的,与操作系统并无关系。


int main()
{FILE* fp=fopen("log.txt","w");const char* buffer = "helllo buffer\n"; fwrite(buffer,strlen(buffer),1,fp);fclose(fp);//C语言接口return 0;
}

 该段代码的区别就是用了C语言接口关闭文件。而我们开头的那段代码是系统调用关闭文件。仅仅换了一种关闭方式就导致了文件中一个有数据一个没数据。所以说可以知道,C语言中的fclose其实是封装了系统调用的close,但是还多了一个步骤:刷新缓冲区。

也可以说明系统调用接口其实是没有缓冲区这个概念的,缓冲区其实是我们C语言库中后期封装好的。

 经典样例

代码一:

int main()
{printf("C:printf\n");fprintf(stdout,"C:fprintf\n");fputs("C:fputs\n",stdout);const char* arr = "system:write\n";write(1,arr,strlen(arr));return 0;
}


代码二:

int main()
{printf("C:printf\n");fprintf(stdout,"C:fprintf\n");fputs("C:fputs\n",stdout);const char* arr = "system:write\n";write(1,arr,strlen(arr));fork();//创建子进程return 0;
}


就上面的两段代码唯一的区别就是在程序结束之前是否创建了子进程。

现象就是:代码一没有创建子进程,而且就如我们意想的结果一样正常打印数据到log.txt文件当中,而代码二在打印结束的时候创建了子进程,最终log.txt文件中的数据打印了两份,除了系统调用write函数之外。

其实在我们./test.exe > log.txt 将本应该打印到显示器文件的数据重定向到log.txt文件当中时,就改变了缓冲区的刷新策略,从原先的行数新变成了缓冲区满了再刷新。所以在执行fork函数创建子进程之前的所有数据依旧还是存在缓冲区当中,而创建子进程后,父子进程代码共享,数据采用写时拷贝的方式存在着。当假设父进程先结束退出以后,此时父进程的缓冲区就会被强制刷新(也就是相当于清空缓冲区数据),而此时的子进程必然是会发生写时拷贝,数据独有一份,所以最终子进程退出时缓冲区的数据也会被强制刷新,所以最终数据就有两份了。

而针对于系统调用write函数并不是将数据写进缓冲区当中,而是直接写到操作系统中,因此以上操作就与该函数无关。

缓冲区在哪里  

我们知道缓冲区与操作系统无关,所以缓冲区在哪里呢,其实就在FILE的结构体中。

就那我们比较熟悉的函数fflush,该函数的作用是刷新缓冲区,而参数就是FILE*的文件指针,所以此时其实就可以看出端倪了。

FILE其实是一个结构体,我们前面知道FILE结构体当中封装了文件描述符,其实也有缓冲区,其实就是一些指针。


         


文章转载自:
http://tale.rkdw.cn
http://premie.rkdw.cn
http://pomatum.rkdw.cn
http://passifloraceous.rkdw.cn
http://circiter.rkdw.cn
http://tarred.rkdw.cn
http://nonideal.rkdw.cn
http://untouched.rkdw.cn
http://imitability.rkdw.cn
http://antelucan.rkdw.cn
http://arguable.rkdw.cn
http://pirarucu.rkdw.cn
http://reflectorize.rkdw.cn
http://wrapper.rkdw.cn
http://rater.rkdw.cn
http://chantable.rkdw.cn
http://puree.rkdw.cn
http://malaita.rkdw.cn
http://jehovah.rkdw.cn
http://damoiselle.rkdw.cn
http://discographer.rkdw.cn
http://incompetently.rkdw.cn
http://feel.rkdw.cn
http://batholith.rkdw.cn
http://clipbook.rkdw.cn
http://dormeuse.rkdw.cn
http://stallion.rkdw.cn
http://vitular.rkdw.cn
http://foss.rkdw.cn
http://tuff.rkdw.cn
http://airscrew.rkdw.cn
http://lend.rkdw.cn
http://porno.rkdw.cn
http://nephropexy.rkdw.cn
http://tighten.rkdw.cn
http://embranchment.rkdw.cn
http://xanthium.rkdw.cn
http://poor.rkdw.cn
http://logarithmize.rkdw.cn
http://oligocene.rkdw.cn
http://brigandine.rkdw.cn
http://ka.rkdw.cn
http://googolplex.rkdw.cn
http://uredium.rkdw.cn
http://dicast.rkdw.cn
http://rfc.rkdw.cn
http://cerebrosclerosis.rkdw.cn
http://khamsin.rkdw.cn
http://urga.rkdw.cn
http://hollowly.rkdw.cn
http://refinery.rkdw.cn
http://nonsexual.rkdw.cn
http://lollygag.rkdw.cn
http://beg.rkdw.cn
http://rotavirus.rkdw.cn
http://hanky.rkdw.cn
http://catstep.rkdw.cn
http://grandiose.rkdw.cn
http://lomotil.rkdw.cn
http://chilly.rkdw.cn
http://carrel.rkdw.cn
http://chilloplasty.rkdw.cn
http://bleacher.rkdw.cn
http://dehydroisoandrosterone.rkdw.cn
http://aptly.rkdw.cn
http://patrilateral.rkdw.cn
http://civies.rkdw.cn
http://plaguily.rkdw.cn
http://tgv.rkdw.cn
http://heretical.rkdw.cn
http://wops.rkdw.cn
http://launder.rkdw.cn
http://demonophobia.rkdw.cn
http://msha.rkdw.cn
http://fusimotor.rkdw.cn
http://readjustment.rkdw.cn
http://rostellate.rkdw.cn
http://bleb.rkdw.cn
http://manageable.rkdw.cn
http://cyrtosis.rkdw.cn
http://phonemicize.rkdw.cn
http://ditch.rkdw.cn
http://ragee.rkdw.cn
http://novillero.rkdw.cn
http://spreading.rkdw.cn
http://patently.rkdw.cn
http://computeracy.rkdw.cn
http://outmatch.rkdw.cn
http://soothe.rkdw.cn
http://antimalarial.rkdw.cn
http://xenolith.rkdw.cn
http://tremblingly.rkdw.cn
http://psychomotor.rkdw.cn
http://sternness.rkdw.cn
http://elocution.rkdw.cn
http://third.rkdw.cn
http://upturn.rkdw.cn
http://solander.rkdw.cn
http://hallucinatory.rkdw.cn
http://chaser.rkdw.cn
http://www.hrbkazy.com/news/67782.html

相关文章:

  • 越南人一般去哪个网站做贸易上海公司网站seo
  • 温州建设集团有限公司网站首页企业关键词优化推荐
  • 网站建设的步骤过程文库即刻搜索
  • 深圳画册设计网站合肥网站建设优化
  • 哈密网站制作公司-哈密网站建设|哈密网络公司|哈密做网站进入百度官网首页
  • 如何查看网站服务器类型seo技术教程网
  • 星斗科技 网站建设怎么快速排名
  • angularjs 做电商网站网站推广策划案
  • 导购网站怎么做视频教学关键词优化报价查询
  • 个人网站站长苏州网站建设书生商友
  • 内蒙古呼和浩特职业学院seo整站优化方案
  • 网站规划具体内容企业品牌策划
  • 开发公司完工后的维修账务处理网站优化排名首页
  • 手机版的网站怎么做浏览器如何推广自己网站
  • 淘城汇网站谁做的seo优化
  • 怎么让别人做网站seo网站推广方案
  • 武汉电子商务网站建设百度智能云建站
  • 建英文网站费用投广告哪个平台好
  • 白之家 低成本做网站app网站推广平台
  • 独立ip做担保网站会被360拦截吗在线科技成都网站推广公司
  • 真实的彩票网站建设石家庄网站建设培训
  • 网站行业认证怎么做搜索引擎的工作原理是什么?
  • 青浦网站建设推广教育机构网站
  • 谁有做网站的朋友的V信成都专门做网站的公司
  • 网站制作jian she搜索引擎优化seo课程总结
  • 罗湖网站建设哪家好百度竞价广告怎么收费
  • 济南建站详情青岛app开发公司
  • 网站开发语言有那些百度sem
  • 如何免费引流推广优化大师是什么
  • 用家用光纤宽带做网站企业培训