标准文件IO详解(三)---缓冲区详解

  标准文件 IO 相比于文件 IO 来说,在用户层中增加了一个用户缓冲区。也就是说在使用标准IO 来操作文件的时候,都会经过此用户层的缓冲区。比如使用标准 IO 来向文件中写入内容的时候,首先内容会首先被写入到用户缓冲区中,等到 缓冲区满 或者 刷新缓冲区 的时候在调用文件 IO 将内容写入到内核中的磁盘缓冲区中。

====================================================

用户缓冲区的类型:

  • 全缓冲

此种类型的缓冲只有在缓冲区满的时候才会调用实际的文件 IO 进入内核态操作。除了涉及到终端设备文件的流,其它文件流默认基本都是全缓冲。

  • 行缓冲

此种类型的缓冲在缓冲区满或者遇到 \n 的时候才会调用实际的文件 IO 进入内核态操作。当流涉及到终端设备的时候就是行缓冲,比如标准输入流和标准输出流。如果对标准输入流或者输出流进行重定向到某个文件的时候,该流就是全缓冲的。

  • 无缓冲

没有缓冲区。直接调用文件 IO 进入内核态操作。标准错误流默认就是无缓冲的。

====================================================

如果对于某文件我们不想要使用其默认的缓冲区类型,c库还提供了setvbuf函数给我们以便去修改文件流默认的缓冲区类型。

函数原型:

函数参数:

  • stream:要改变缓冲区的文件流指针
  • buf:设置的缓冲区首地址
  • mode:设置的缓冲区类型,当设置为无缓冲时,参数buf和size会被忽略
  • size:设置的缓冲区的大小

返回值:

  • 调用成功时返回 0
  • 调用失败返回 非0值

====================================================

mode参数可以是以下几个宏之一:

  • _IOFBF:全缓冲;如果参数 buf 为NULL,则系统会自动分配适当大小的缓冲区。否则参数 buf 被设置为缓冲区的首地址。
  • _IOLBF:行缓冲;如果参数 buf 为NULL,则系统会自动分配适当大小的缓冲区。否则参数 buf 被设置为缓冲区的首地址。
  • _IONBF:无缓冲;函数会忽略 buf 和 size 这两个参数。
时间: 2024-10-24 18:32:48

标准文件IO详解(三)---缓冲区详解的相关文章

标准文件IO详解(一)---文件IO操作和标准文件IO操作的区别

POSIX IO操作称为文件IO,也称为低级文件IO,是操作系统提供的系统调用,属于没有缓冲区的文件操作方式.执行该种操作后,内容会直接被写入到内核中的提供给磁盘的专门缓冲区中,内核会定期的刷新该缓冲区,将内容同步到磁盘当中. ANSI  C IO操作称为标准文件IO,也称为高级文件IO,是C库函数提供的,属于带有缓冲区的文件操作方式.执行该种操作后,内容首先会将内容写入到用户空间的缓冲区中,待缓冲区满或者需要刷新的时候再去调用文件IO,将内容写入到内核的磁盘缓冲区当中. 相比于低级文件IO,高

标准文件IO详解(二)---标准输入流、标准输出流和标准错误流

在文件 IO 中使用文件描述符fd来表示一个文件不同,而标准 IO 使用一个指向 FILE 对象的指针来代表一个文件.FILE 对象实际上是一个结构体,此结构体中封装了代表文件的文件描述符.当然不仅仅是含有文件描述符,其中还会记录属于该文件的用户缓冲区信息. 在文件 IO 详解笔记中提到过标准输入.标准输出和标准错误,分别对应文件描述符的0.1.2,也可以使用STDIN_FILENO.STDOUT_FILENO和STDERR_FILENO三个宏来代替.这三个文件描述符是创建进程时默认会打开的.

Nginx知多少系列之(三)配置文件详解

原文:Nginx知多少系列之(三)配置文件详解 目录 1.前言 2.安装 3.配置文件详解 4.工作原理 5.Linux下托管.NET Core项目 6.Linux下.NET Core项目负载均衡 7.Linux下.NET Core项目Nginx+Keepalived高可用(主从模式) 8.Linux下.NET Core项目Nginx+Keepalived高可用(双主模式) 9.Linux下.NET Core项目LVS+Keepalived+Nginx高可用集群 10.构建静态服务器 11.日志

java io系列12之 BufferedInputStream详解

目录1. BufferedInputStream 介绍2. BufferedInputStream 源码分析(基于jdk1.7.40)3. 示例代码 BufferedInputStream 是缓冲输入流.它继承于FilterInputStream. BufferedInputStream 的作用是为另一个输入流添加一些功能,例如,提供"缓冲功能"以及支持"mark()标记"和"reset()重置方法".BufferedInputStream 本质

spark2.x由浅入深深到底系列六之RDD java api详解三

学习任何spark知识点之前请先正确理解spark,可以参考:正确理解spark 本文详细介绍了spark key-value类型的rdd java api 一.key-value类型的RDD的创建方式 1.sparkContext.parallelizePairs JavaPairRDD<String, Integer> javaPairRDD =         sc.parallelizePairs(Arrays.asList(new Tuple2("test", 3

php学习之道:WSDL详解(三)

通过声明方式定义绑定(binding)属性 如果你在服务中采用SOAP binding,你可以使用JAX-WS来指定一定数量的属性binding.这些属性指定对应你在WSDL中指定的属性.某些设置,比如参数类型,可以约束你实现的方法,这些设置也影响声明的效用. @SOAPBinding声明,定义在javax.jws.soap.SOAPBinding接口中.它提供发布时的SOAP Binding细节.如果@SOAPBinding没有被指定,则用缺省的doc/literal SOAPBinding.

UINavigationController详解三(转)ToolBar

原文出自:http://blog.csdn.net/totogo2010/article/details/7682641,特别感谢. 1.显示Toolbar  在RootViewController.m的- (void)viewDidLoad方法中添加代码,这样Toobar就显示出来了. [cpp] view plaincopy [self.navigationController  setToolbarHidden:NO animated:YES]; 2.在ToolBar上添加UIBarBut

Hibernate复习(三)配置文件详解

1.hibernate.cfg.xml 2.映射文件Person.hbm.xml Java的实体类是通过配置文件与数据表中的字段相关联.Hibernate在运行时解析配置文件,根据其中的字段名生成相应的SQL语句 a.id属性 <generator>子元素用来设定标识符生成器.Hibernate提供了多种内置的实现. b.property属性 ? name属性:指定持久化类的属性的名字. ? type属性:指定Hibernate或Java映射类型.Hibernate映射类型是Java类型与SQ

logback -- 配置详解 -- 三 -- &lt;encoder&gt;

附: logback.xml实例 logback -- 配置详解 -- 一 -- <configuration>及子节点 logback -- 配置详解 -- 二 -- <appender> logback -- 配置详解 -- 三 -- <encoder> logback -- 配置详解 -- 四 -- <filter> -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --