unix环境高级编程-5.4-缓冲

Unix环境高级编程---基础知识 阅读详情

提到缓冲这个概念,大家都知道非常熟悉不过了,我们在写程序的时候,比如java,C++都会涉及到一些缓冲的概念,那么到底缓冲有什么好的作用的。

 

其实缓冲在unix的操作系统里,就是为了减少read和write的调用次数。在第三章中,对不同缓冲区的长度设置,执行IO所要的cpu时间量是不一样的。他也对每个io流自动的进行缓冲管理,从而避免了应用程序需要考虑这一点所带来的麻烦。不幸的是,标准I/O库最令人迷惑的也是他的缓冲。

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

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

术语冲洗(flush)说明标准I/O缓冲区的写操作,缓冲区可由标准IO例程自动冲洗,或者可以调用函数fflush冲洗一个流。值得注意的是,在unix环境中,flush有两个含义,标准I/O函数库中,flush冲洗意味着将缓冲去的中的内容邪道磁盘上。在终端驱动程序方面,flush表示丢弃已经存储在缓冲去的中的数据。

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

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

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

 

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

 

IOS 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值。

 查看GNU c手册。

void setbuf (FILE *stream, char *buf) [Function]
If buf is a null pointer, the effect of this function is equivalent to calling setvbuf
with a mode argument of _IONBF. Otherwise, it is equivalent to calling setvbuf with
buf, and a mode of _IOFBF and a size argument of BUFSIZ.
The setbuf function is provided for compatibility with old code; use setvbuf in all
new programs.
void setbuffer (FILE *stream, char *buf, size t size) [Function]
If buf is a null pointer, this function makes stream unbuffered. Otherwise, it makes
stream fully buffered using buf as the buffer. The size argument specifies the length
of buf.
This function is provided for compatibility with old BSD code. Use setvbuf instead.

 

 

void setbuf (FILE *stream, char *buf) [Function]
If buf is a null pointer, the effect of this function is equivalent to calling setvbuf
with a mode argument of _IONBF. Otherwise, it is equivalent to calling setvbuf with
buf, and a mode of _IOFBF and a size argument of BUFSIZ.
The setbuf function is provided for compatibility with old code; use setvbuf in all
new programs.
void setbuffer (FILE *stream, char *buf, size t size) [Function]
If buf is a null pointer, this function makes stream unbuffered. Otherwise, it makes
stream fully buffered using buf as the buffer. The size argument specifies the length
of buf.
This function is provided for compatibility with old BSD code. Use setvbuf instead.

这个函数一定要在流已经在被打开后调用,(十分明显,因为每个函数都要求一个有效的文件指针作为他的一个参数),而且应该要在对该流执行任何一个其他操作之前调用。

 

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

s使用setvbuf,我们可以景区的指定所需的缓冲类型。这是用mode参数实现的。

_IOFBF 全缓冲

_IOLBF  行缓冲

_IONBF 不带缓冲

 

如果,指定一个不带缓冲的流,则忽略buf和size参数,如果只的那个全缓冲和行缓冲,则buf和size可选择指定的一个缓冲区及其长度。如果该流是带缓冲的。而buf是努力啦,则标准的库,将自动的诶该流分配适当的长度的缓冲区。适当长度的指的是有常量BUFSIE所指定的值。

下图:

 

要了解,如果在一个函数内分配一个自动变量类的标准I/O缓冲区,则从该函数返回之前,必须关闭该流。另外有些实现将缓冲区的一部分用于村饭他自己的管理操作信息,所以可以存放换从去忠的实际数据字节数少女size。一般

一般而言,应该有系统选择缓冲区的长度。并自动分配。

任何时候我们可以强制刷新一个流。

#include<stdio.h>

int fflush(FILE * fp);


成功返回0,出错则会EOF.

 

int fflush (FILE *stream) [Function]
This function causes any buffered output on stream to be delivered to the file. If
stream is a null pointer, then fflush causes buffered output on all open output
streams to be flushed.
This function returns EOF if a write error occurs, or zero otherwise.

 

此函数使该流所有威胁的数据被传送值内核,作为一个特例,如若fp是NULL,此函数将倒是所有输出流被冲洗。

 

更多请访问:http://blog.youkuaiyun.com/wallwind

UNIX环境高级编程重点复习 文章目录名词解释题简答题程序题书上例程读程序写结果改错写程序论文《The Three Pillars of Machine Programming》相关论文《pix2code: Generating Code From a Graphical User》、sketch2code相关小组项目相关 名词解释题 1.内核(kernel): 内核是一种软件,它控制计算机硬件资源,提供程序运行环境。内核通常... 阅读详情

相关推荐

保姆级教程:用CellOracle 0.10.13分析你的单细胞数据,从GRN构建到基因扰动模拟

本文详细介绍了如何使用CellOracle 0.10.13进行单细胞数据分析,从基因调控网络(GRN)构建到基因扰动模拟的全流程。通过环境配置、数据准备、GRN构建和扰动模拟等步骤,帮助研究者高效预测细胞命运决定的分子机制,特别针对实际分析中的易错点提供解决方案。

weixin_42525005的博客 436

Unix系统的三种缓冲区行缓冲、全缓冲、无缓冲(以及如何调整缓冲区的类型)

from unix系统编程 p91 练习4-22 下面的程序会产生什么样的输出呢? #include #include int main() {     printf("This is my output.") ;     fork() ;     return 0 ; } 输出如下所示: This is my output.T

1987

Ubuntu20.04下 嵌入式 Qt 开发环境的搭建(适用于Tiny6410)

Ubuntu 下 Tiny6410 嵌入式 Qt 开发环境的搭建 目录导航Ubuntu 下 Tiny6410 嵌入式 Qt 开发环境的搭建前言1.安装前的准备工作2.安装交叉编译器 前言 这篇文章,主要是基于 Ubuntu19.10版本而写,写此文的初衷,是为了自己使用,因为最近正在以Tiny6410板子做实训,所以也是初学者一枚,只能保证我遇上的问题统统能够解决掉,至于一些没遇上的,欢迎各位看客给我留言,大家一起讨论,一起解决。 注:本文会持续更新 1.安装前的准备工作 环境要求 Linux系统:U

繁臻的小窝 4893

fsync mysql_linux 磁盘 sync,fsync,fflush

sync,是同步整个系统的磁盘数据的.fsync是同步打开的一个文件到缓冲区数据到磁盘上.fflush是刷新打开的流的.fsync(将缓冲区数据写回磁盘)相关函数 sync表头文件 #include定义函数 int fsync(int fd);函数说明 fsync()负责将参数fd所指的文件数据,由系统缓冲区写回磁盘,以确保数据同步。返回值 成功则返回0,失败返回-1,errno为错误代码。传统的...

weixin_33957278的博客 499

汇川伺服驱动器参数优化实战指南

本文详细介绍了汇川伺服驱动器参数优化的实战技巧,涵盖控制模式选择、电子齿轮比调整、刚性匹配与振动抑制等关键内容。通过实际案例和实用技巧,帮助工程师快速掌握伺服驱动器参数调校方法,提升设备运行精度和稳定性。特别针对高精度定位和高速响应场景提供了专业指导。

weixin_29070721的博客 731

Python实战:5分钟搞定VCF文件中每个样本的SNP统计(附bcftools安装指南)

本文介绍了三种高效统计VCF文件中每个样本SNP数量的Python方法,包括原生解析、结合bcftools的推荐方案以及使用PyVCF3专业库。特别推荐bcftools结合Python的方法,适用于中大型VCF文件,显著提升处理效率。文章还提供了bcftools安装指南和进阶统计技巧,帮助生物信息学分析人员快速完成SNP统计任务。

weixin_30555125的博客 493

UNIX缓冲机制

某日一朋友写了一个HELLO WORLD代码,出不来结果,代码如下: #include &lt;stdio.h&gt; int main(int argc, char **argv) { printf("hello world!"); _Exit(0); }    注意到,在代码中printf语句打印的字符串最后没有带换行符,而且最...

igaozh的专栏 205

UCD9081EVM电源时序管理:硬件配置与GUI操作全解析

电源时序管理是复杂电子系统设计的核心环节,它通过精确控制多路电源的上电/下电顺序,确保核心芯片免受浪涌电流或电压倒灌的损害。其原理基于状态机逻辑与电压监控,技术价值在于将硬连线时序转化为可编程配置,极大提升了系统可靠性与设计灵活性。在服务器、通信设备、工控系统等高可靠性应用场景中,时序控制器是实现稳定启动与故障保护的关键。本文以德州仪器UCD9081评估模块为例,深入剖析其硬件跳线配置与图形用户界面操作,涵盖I2C地址设置、电压监控分压计算、时序条件与故障响应策略等工程实践要点,帮助工程师快速掌握这一电源时

weixin_42696271的博客 302

《操作系统》——缓冲技术

缓冲技术大致分为三种:单缓冲、双缓冲、缓冲池。下面我来简单介绍一下计算机中的缓冲技术。

zhoukun@Fly 2万+

【目标跟踪】多目标跟踪的评价工具motmetrics怎么使用?

多目标跟踪,通过motmetrics测试评价对应的视频。

聿默的博客 5366

【深度学习新浪潮】OpenClaw跟机器人行业有哪些很好的研究结合点?

OpenClaw正通过"AI大脑+机器人肢体"的深度融合,重新定义机器人与人类的交互方式和自主操作能力。近期ROSClaw框架发布、人形机器人集成和空间计算试验等进展,标志着OpenClaw已从概念验证阶段进入实际应用落地期,为机器人行业带来了自然语言控制普及化具身智能平民化和跨平台开发标准化三大变革机遇。

专注:太空算力、AI infra、异构调度、大模型成本工程 228

UNIX环境高级编程

转自:unix环境高级编程 I/O 文件系统 进程 线程 进程间通信 一.文件I/O三.标准I/O库八.高级I/O 二.文件和目录 四.进程环境五.进程控制 六.线程七.线程控制 九.进程间通信十.信号 一.文件I/O 1.文件描述符 2.相关调用 2.1 打开文件 2.2 创建文件 2.3 关闭文件 2.4 定位读写位置 2.5 文件读 2.6 文件写 2.7 fcntl函数 3.进程间文件共享 4.原子操作 5.数据同步 二.文件和目录 前言:文

qq_39815320的博客 3617

利用Dify平台打造大学生专属AI模拟面试助手:从零到精通的完整指南

在这个充满竞争的就业市场中,拥有一个24小时在线的AI面试教练无疑是大学生求职路上的秘密武器。通过本文的指导,你已经掌握了使用Dify平台构建专业级模拟面试助手的全套技能。从环境部署、模型选择,到Prompt设计、知识库集成,再到高级功能开发和效果优化,我们一步步打造了一个能够适应不同岗位、提供专业反馈的智能面试系统。无论是技术岗的算法问答,还是咨询业的案例分析,或是外企的英语面试,你的定制助手都能提供针对性训练。更重要的是,这个方案具有极强的可扩展性。

专注于编程、AI、人工智能等多个领域内容研究和分析 2789

【unix】unix环境高级编程

一 创建 ⑴线程命名规则 nioEventLoop-1-XX -1指的是线程池 -XX在group中的loop 创建并保存线程执行器 创建mpscQueue异步任务队列 创建线程选择器,循环nioEventLoop数组 二 启动 1.服务端启动绑定端口 2.新连接接入 三 执行 一个普通任务队列 一个定时任务队列 任务聚合时会把定时任务队列拉去到普通任务队列,保证串行无锁化 四 亮点 ⑴ ⑵ha...

屎蛋的铲屎官 1674

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

《UNIX 环境高级编程》核心思想讲座课件

被誉为UNIX编程"圣经"的经典著作作者:W. Richard Stevens和Stephen A. Rago第1版(1992年)、第2版(2005年)、第3版(2013年)的演进Dennis Ritchie(UNIX和C语言之父)评价:“这是一本弥足珍贵的经典著作”进程间通信的需求与挑战UNIX/Linux中的IPC机制分类IPC机制的选择依据深入理解操作系统工作原理掌握底层编程技能的重要性UNIX设计哲学在现代软件开发中的应用。

AI天才研究院 1187

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

UNIX高级环境编程-初读心得

写在前面 大概从7月中旬~10月10中旬,花了大概三个月左右的时间,通读了《UNIX高级环境编程》第1章到第20章。读之前的状态大概是只懂一点linux命令行,c语言入门水平。通读的过程大概就是每天早上花1至2个小时,对于书中的一些代码,尽量都照着抄了一遍,写了一些对代码的理解在上面。学习过程中我个人觉得有一些章节读起来就比较枯燥,而有一些章节读起来则津津有味。因为就读了一遍,所以经常会有前面的知...

每天完成一个小目标 3147

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

unix环境编程 第五章 5.4缓冲

5.3 标准输入,标准输出和标准错误 以上内容来源于网络,仅作本人学习笔记使用,关于本书请参考APUE。

weixin_43873960的博客 201

UNIX环境高级编程笔记

环境配置 1、下载apue.3e文件夹,可以通过http://www.apuebook.com/code3e.html现在源码。 2、解压后执行进入apue.3e中执行make指令。如果出现 ```collect2: error: ld returned 1 exit statusMakefile:31: recipe for target 'badexit2' failedmake[1]: *...

天码丶行满 2197

Unix环境高级编程复习总结

严格意义,OS是一种方便用户管理和控制计算机硬件资源的软件(内核)广义,OS包括内核和其他软件(shell,库函数)

Stayforword的博客 965
上一篇: unix环境高级编程-5.2~3标准I/O库。
下一篇: c++ string使用详解
ctreewang
博客等级 码龄16年 1608粉丝 276原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值