标准I/O库之缓冲

标准I/O库提供缓冲的目的是尽可能减少使用read和write调用的次数。它也对每个I/O流自动地进行缓冲管理,从而避免了应用程序需要考虑这一点所带来的麻烦。

标准I/O提供了三种类型的缓冲:

(1)全缓冲。这种情况下,在填满标准I/O缓冲区后才进行实际的I/O操作。对于驻留在磁盘上的文件通常是由标准I/O库实施全缓冲的。在一个流上执行第一次I/O操作时,相关标准I/O函数通常调用malloc获得需使用的缓冲区。

术语冲洗(flush)说明标准I/O缓冲区的写操作。缓冲区可由标准I/O例程自动冲洗(例如当填满一个缓冲区时),或者可以调用函数fflush冲洗一个流。值得引起注意的是在UNIX环境中,flush有两种意思:在标准I/O库方面,flush(冲洗)意味着将缓冲区中的内容写到磁盘上(该缓冲区可能只是局部填写的)。在终端驱动程序方面,flush(刷清)表示丢弃已存储在缓冲区中的数据。

(2)行缓冲。在这种情况下,当在输入和输出中遇到换行符时,标准I/O库执行I/O操作。这允许我们一次输出一个字符(用标准I/O fputc函数,该函数一次只输出一个字符,没有换行符),但只有在写了一行之后才进行实际I/O操作。当流涉及一个终端时(例如标准输入和标准输出),通常使用行缓冲。

对于行缓冲有两个限制。第一,因为标准I/O库用来收集每一行的缓冲区的长度是固定的,所以只要填满了缓冲区,那么即使还没有写一个换行符,也进行I/O操作。第二,任何时候只要通过标准I/O库要求从(a)一个不带缓冲的流,或者(b)一个行缓冲的流(它要求从内核得到数据)得到输入数据,那么就会造成冲洗所有行缓冲输出流。在(b)中带了一个括号中的说明,其理由是,所需的数据可能已在该缓冲区中,它并不要求在需要数据时才从内核读数据。很明显,从不带缓冲的一个流中进行输入((a)项)要求当时从内核得到数据。

(3)不带缓冲标准I/O库不对字符进行缓冲存储。例如,如果用标准I/O函数fputs写15个字符到不带缓冲的流中,则该函数很可能用write系统调用函数将这些字符立即写到相关联的打开文件上。

标准出错流stderr通常是不带缓冲的,这就使得出错信息可以尽快显示出来,而不管它们是否含有一个换行符。

ISO C要求下列缓冲特征:

  • 当且仅当标准输入和标准输出并不涉及交互式设备时,它们才是全缓冲的。
  • 标准出错绝不会是全缓冲的。

但是,这并没有告诉我们如果标准输入和输出涉及交互式设备时,它们是不带缓冲的还是行缓冲的;以及标准出错是不带缓冲的还是行缓冲的。很多系统默认使用下列类型的缓冲:

  • 标准出错是不带缓冲的。
  • 如若是涉及终端设备的其他流,则它们是行缓冲的;否则是全缓冲的。

对任何一个给定的流,如果我们并不喜欢这些系统默认的情况,则可调用下列两个函数中的一个更改缓冲类型:

#include <stdio.h>
void setbuf( FILE *restrict fp, char *restrict buf );
int setvbuf( FILE *restrict fp, char *restrict buf, int mode, size_t size );
返回值:若成功则返回0,若出错则返回非0值

这些函数一定要在流已被打开后调用,而且也应该在对该流执行任何一个其他操作之前调用。

可以使用setbuf函数打开或关闭缓冲机制。为了带缓冲进行I/O,参数buf必须指向一个长度为BUFSIZE的缓冲区(该常量定义在<stdio.h>中)。通常在此之后该流就是全缓冲的,但是如果流与一个终端相关,那么某些系统也可将其设置为行缓冲。为了关闭缓冲,将buf设置为NULL

使用setvbuf,我们可以精确地指定所需的缓冲类型。这是用mode参数实现的:

_IOFBF全缓冲
_IOLBF行缓冲
_IONBF不带缓冲

如果指定一个不带缓冲的流,则忽略buf和size参数。如果指定全缓冲或行缓冲,则buf和size可选择地指定一个缓冲区及其长度。如果该流是带缓冲的,而buf是NULL,则标准I/O库将自动地为该流分配适当长度的缓冲区。适当长度指的是由常量BUFSIZE所指定的值。

某些C函数库实现使用stat结构中的成员st_blksize所指定的值决定最佳I/O缓冲区长度。GNU C函数库就使用这种方法。

表5-1列出了这两个函数的动作,以及它们的各个选项。

0_1312859290ZZlQ.gif

要了解,如果在一个函数内分配一个自动变量类的标准I/O缓冲区,则从该函数返回之前,必须关闭该流。另外,有些实现将缓冲区的一部分用于存放它自己的管理操作信息,所以可以存放在缓冲区中的实际数据字节数少于size。一般而言,应由系统选择缓冲区的长度,并自动分配缓冲区。在这种情况下关闭此流时,标准I/O库将自动释放缓冲区。

任何时候,我们都可以强制冲洗一个流。

#include <stdio.h>
int fflush( FILE *fp );
返回值:若成功则返回0,若出错则返回EOF

此函数使该流所有未写的数据都被传送至内核。作为一个特例,如若fp是NULL,则此函数将导致所有输出流被冲洗。

 

 

本篇博文内容摘自《UNIX环境高级编程》(第二版),仅作个人学习记录所用。关于本书可参考:http://www.apuebook.com/

 

转载于:https://www.cnblogs.com/nufangrensheng/p/3505307.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/360171.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java如何写安卓接口文档_android、java制作sdk以及自动生成文档

最近一直在做android开发&#xff0c;昨天经理让我写个接口SDK做个接口文档&#xff0c;以便后面的开发。这让我很焦灼&#xff0c;SDK怎么做&#xff1f;要是只有敲代码还好。可是那个接口文档&#xff01;&#xff01;&#xff01;文档这东西最讨厌了&#xff0c;头都大了后来…

[转载]jquery cookie的用法

原文地址:http://www.cnblogs.com/qiantuwuliang/archive/2009/07/19/1526663.html jQuery cookie是个很好的cookie插件&#xff0c;大概的使用方法如下 example $.cookie(’name’, ‘value’); 设置cookie的值&#xff0c;把name变量的值设为value example $.cookie(’name’…

21世纪的设计模式:抽象工厂模式

这是我的演讲的第二部分&#xff0c;“ 21世纪的设计模式” 。 此模式在Java代码中到处都有使用&#xff0c;尤其是在更多“企业”代码库中。 它涉及一个接口和一个实现。 该界面如下所示&#xff1a; public interface Bakery {Pastry bakePastry(Topping topping);Cake bak…

java textfield类方法_java.awt.TextField类

java.awt.TextField是一个文本框组件1.构造方法TextField()&#xff1a;创建一个默认长度为一个机器字符长的文本框TextField(int n)&#xff1a;创建一个指定长度为n个机器字符长的文本框TextField(String s)&#xff1a;创建一个文本框&#xff0c;该文本框的初始字符串为sTe…

广东金融学院java实验报告_《大学计算机Ⅰ》实验报告实验三

广东金融学院实验报告课程名称&#xff1a;大学计算机Ⅰ实验编号 及实验名称 姓 名 实验地点 指导教师蔡文璇 12-204课室 伍春晖博士实验三 中文Excel 2007实验系 别 班 级 实验时数 成 绩财经传媒系 经济秘书(2)班6学 号 实验日期 同组其他成员111602242 2011年 12 月07 日无一…

Markdown会干掉Html吗?

Markdown会干掉Html吗&#xff1f; 很明显&#xff0c;MarkDown正在已一种比病毒还快的速度传播着&#xff0c;量子的机器人语言也是深受其启发&#xff0c;当然了&#xff0c;在这个东西没搞出来之前&#xff0c;MarkDown就能干很多事情&#xff0c;比如在线编辑。 有了它&…

java动态变量名反射_Java动态性—反射 - Eclipse666的个人空间 - OSCHINA - 中文开源技术交流社区...

1.什么是动态语言&#xff1f;程序运行时&#xff0c;可以改变程序的结构或者变量类型&#xff1b;如Python&#xff0c;javaScriptfunction(){var s"var a3;var b4;" evals(s);}在执行javascript代码的的过程中&#xff0c;可以改变变量的值或插入语句改变结构。但J…

java中的module是什么意思_Angular - 组件中module.id的含义是什么?

Update for (2017-03-13) &#xff1a;删除了所有提及的moduleId . “组件相对路径”cookbook已删除我们在我们推荐的SystemJS配置中添加了一个新的SystemJS插件(systemjs-angular-loader.js) . 此插件动态地将templateUrl和styleUrls中的“组件相对”路径转换为“绝对路径” .…

HTML跳转

Window.location.href"http://www.baidu.com/"转载于:https://www.cnblogs.com/hucaihao/p/3514165.html

Spring注释,我从来没有机会使用第1部分:@primary

今天&#xff0c;我想起了我的一个老朋友&#xff08;primary&#xff09;&#xff0c;我们从教程到教程都遇到了他。 您知道在Spring Autowired批注中按类型工作&#xff0c;也就是说&#xff0c;如果Spring找到符合类型的匹配的合格bean&#xff0c;则会将其注入。让我们在示…

mysql构建栋_【转载】这次拆库 应是微服务化的拆分方式

一、现状现状.png我们将一个大而全的系统一拆为三&#xff0c;容器&#xff0c;发布&#xff0c;测试都已经独立出去&#xff0c;但是原始的数据库还是一套&#xff0c;现在需要将数据库做一个拆分&#xff0c;A、B、C三个系统有各自的数据库之后&#xff0c;我们的微服务化在现…

使用SharePoint 2010新增的文档集内容类型来管理文档

使用SharePoint 2010新增的文档集内容类型来管理文档 SharePoint 2010新增加的文档集功能是作为内容类型存在的&#xff0c;使用范围在网站集中&#xff0c;需要激活“文档集”功能到网站集才可以正常使用。文档集其实就是一个SharePoint产品增强的文件夹和内容类型的综合体现。…

如何使用Java 8流快速替换列表中的元素

假设您有一个项目清单&#xff1a; List<String> books Arrays.asList("The Holy Cow: The Bovine Testament","True Hip Hop","Truth and Existence","The Big Book of Green Design" );&#xff08;不要判断我。此随机书生成…

db2和mysql性能优化_DB2数据库性能调优的十个办法

这篇文章主要是针对e-business OLTP的10个性能方面的Tips。10. Monitor Switches打开Monitor Switch,才能获得性能方面的信息,命令如下db2 "update monitor switches using lock ON sort ON bufferpool ON uow ON table ON statement ON"9. Agents要保证有足够的agen…

处理远程通知的方法

IOS的一大特点就是可以随时向客户端push相关的信息。那么在客户端收到这些信息时&#xff0c;如何处理呢&#xff1f; 有两种情景需要处理&#xff0c; 一是&#xff1a;从状态栏下拉&#xff0c;点击通知栏里的一项&#xff0c;启动应用 二是&#xff1a;在锁屏界面&#xff0…

java merge into_Oracle merge into的使用

最近项目上使用Oracle的Merge&#xff0c;所以找来一下资料学习了解。该命令使用一条语句从一个或者多个数据源中完成对表的更新和插入数据. ORACLE 9i 中&#xff0c;使用此命令必须同时指定UPDATE 和INSERT 关键词,ORACLE 10g 做了如下改动。特点&#xff1a;1、insert 和upd…

基于visual Studio2013解决算法导论之019栈实现(基于数组)

&#xfeff;&#xfeff;&#xfeff;题目用数组实现栈解决代码及点评#include <stdio.h> #include <stdlib.h> #include <time.h> #include <malloc.h> #include<assert.h>typedef struct Stack {int nTop;int nLen;int *pnArr; }Stack, *PSta…

关闭终端php就退出进程_解决windows下php-cgi进程经常自动关闭

php-cgi在linux中有fpm管理&#xff0c;Apache不是采用cgi这种模式&#xff0c;于是乎就出现了&#xff0c;在windows下&#xff0c;采用nginx时&#xff0c;开启的php-cgi监听非常不稳定&#xff0c;经常奔溃关闭。现在解决了这个问题。注意是win32位系统下解决的&#xff0c;…

九度OJ 1437 To Fill or Not to Fill -- 贪心算法

题目地址&#xff1a;http://ac.jobdu.com/problem.php?pid1437 题目描述&#xff1a; With highways available, driving a car from Hangzhou to any other city is easy. But since the tank capacity of a car is limited, we have to find gas stations on the way from …

php为什么获取不到id,微信小程序无法获取到unionId怎么办

UnionID机制说明如果开发者拥有多个移动应用、网站应用、和公众帐号(包括小程序)&#xff0c;可通过unionid来区分用户的唯一性&#xff0c;因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序)&#xff0c;用户的unionid是唯一的。换句话说&#x…