一、在linux系统中,标准的I/O提供了三种类型的缓冲。
1、全缓冲:在这种情况下,在填满I/O缓冲区后再进行实际的I/O操作。对于驻留在磁盘上的文件通常由标准I/O库实施全缓冲。调用fflush函数冲洗一个流。冲洗意味着将缓冲区的内容写到磁盘上。
2、行缓冲:在这种情况下,当在输入和输出遇到换行符时,标准I/O执行I/O操作。允许我们一次输出一个字符。涉及一个终端时,通常使用行缓冲。
对于行缓冲,有两个限制。第一,因为标准I/O库收集每一行的缓冲区的长度是固定的,所以只有填满的了缓冲区,那么即使没有换行符,也会进行I/O的操作。第二,任何时候只要通过标准I/O库要求从a一个布袋缓冲的流,或者b一个行缓冲的流(它要求从内核得到数据)得到输入数据,那么就会造成冲洗所有行缓冲输出流。在b中带了一个在括号中的说明,其理由是,所需的数据可能已在缓冲区中,他并不需求在需要数据时才从内核读数据。很明显,从不带缓冲的一个流中进行输入要求当时从内核得到数据。
3、不带缓冲的。标准I/O不对字符进行缓冲处理。例如:如果标准I/O函数fputs写15个字符到不带缓冲的流上,就会调用write的相关的函数立即写入打开的文件上。
二、通过下面的代码,可以更清楚的了解全缓冲和行缓冲的区别。
#include<stdio.h>
#include<unistd.h>
int glob=6;
char buf[]="a write ro stdout\n";
int main()
{
int var;
pid_t pid;
printf("a write to stdout\n");
//fflush(NULL);
if((pid=fork())<0)
{
printf("fork error");
}
else
{
if(pid==0)
{
glob++;
var++;
}
else
{
sleep(2);
//i++;
}
}
printf("pid=%d,glob=%d,var=%d\n",getpid(),glob,var);
exit(0);
}
编译后运行结果:
gcc buff.c -o buff
./buff

再者,运行./buff>temp
cat temp

第一种编译的时候,因为采用的是交互式终端,所以采用的是行缓冲 ,在printf之后立即刷新缓冲区。
第二种编译,将I/O重定向在temp文件中,查看temp的文件,会有两次输出a write to stdout,因为它采用的是全缓冲。
可以将程序中fflush(NULL)加入,则只会输出一次
a write to stdout
因为flush即时刷新了缓冲区
分享到:
相关推荐
在Visual FoxPro 9.0(VFP9.0)中,行缓冲方式操作Grid数据是一种常见的编程技术,主要用于提高数据处理效率和用户界面的交互性。Grid控件是VFP中常用的数据展示和编辑工具,它允许用户直接在表单上查看和编辑数据库...
`setbuf`函数接受一个`FILE`指针和一个缓冲区指针作为参数,而`setvbuf`则额外允许指定缓冲区类型(全缓冲、行缓冲或无缓冲)和大小。例如,若要设置一个10字节大小的行缓冲区,可以使用`setvbuf(stream, buffer, _...
双缓冲技术在图形编程中是一种优化策略,尤其是在 Delphi 这样的编程环境中,它能显著提升界面绘制的平滑度和性能。双缓冲的主要目的是减少屏幕闪烁和图像撕裂,提高用户界面的视觉质量。 在Delphi中,双缓冲主要...
2. **缓冲池管理**:创建一个管理类来维护整个缓冲池,包括初始化缓冲池(分配内存并初始化缓冲区对象)、获取空闲缓冲区(从池中取出未被使用的缓冲区)、归还缓冲区(将使用完的缓冲区放回池中)和释放缓冲池...
TCP发送和接收缓冲区是TCP实现这些功能的重要机制,它们在TCP通信过程中起着至关重要的作用。 首先,我们要理解TCP发送缓冲区。发送缓冲区是操作系统为每个TCP连接维护的一个内存区域,用于暂时存储待发送的数据。...
你可以调整颜色和透明度,以便更清晰地看到原始数据和缓冲区的关系。 - 使用缓冲区进行空间查询,比如找出位于缓冲区内所有其他点或面图层的要素,这可以帮助分析影响范围。 - 对于污染扩散分析,可以将缓冲区与...
缓冲主要分为全缓冲(Full Buffering)、行缓冲(Line Buffering)和无缓冲(No Buffering)三种类型。 1. **全缓冲**: 全缓冲模式下,数据会被存储在一个缓冲区中,直到缓冲区被完全填满或者遇到特定条件(如强制...
环形缓冲区组件是LabVIEW中一个非常实用的数据处理工具,尤其适用于实时数据流处理和存储。它的工作原理类似于一个有限大小的循环数组,新数据到来时会替换旧数据,从而保持缓冲区的满状态。 环形缓冲区的主要优点...
本主题将深入探讨如何使用Cesium绘制点、线和面的缓冲区,这在构建复杂的三维地理信息系统(GIS)应用时尤其有用。通过理解和运用这些技术,开发者能够高效地展示大量数据并提升用户体验。 首先,让我们理解“缓冲...
栈溢出可以分为两种类型:栈缓冲区溢出和栈返回地址溢出。 堆溢出是指由于程序没有正确地检查用户输入的数据长度,导致堆缓冲区溢出,攻击者可以将恶意代码注入堆缓冲区,从而控制系统。堆溢出可以分为两种类型:堆...
在编程领域,缓冲区是一种非常重要的概念,尤其是在处理大量数据传输和提高程序性能时。C#作为.NET框架的一部分,提供了丰富的支持来处理缓冲区。在这个“C#缓冲区分析代码”中,我们可以深入理解如何在C#中有效地...
点和线多边形缓冲区是GIS(地理信息系统)中常用的一种技术,它涉及到空间分析和几何处理。在C#编程环境下,我们可以利用.NET Framework提供的Geometry类库来实现这一功能,尤其是在开发基于Web的地图应用时,如使用...
### C++ 双缓冲绘图技术详解 #### 一、双缓冲绘图技术概述 ...通过以上的介绍和示例,我们可以清楚地了解到双缓冲绘图技术的工作原理及其在实际开发中的应用方式。这对于提高图形界面的用户体验和性能具有重要的意义。
当需要绘制一条线时,算法会根据线的起点和终点,判断这条线应该归入哪个缓冲区。在缓冲区内,线条以某种方式编码存储,通常是通过像素坐标或者线的参数方程。一旦所有线条都被添加到相应的缓冲区,就可以一次性将两...
### 双缓冲技术原理以及优缺点 #### 一、双缓冲技术原理 ...然而,双缓冲技术也存在一定的局限性,比如增加了内存消耗和潜在的性能开销。因此,在实际应用中需要根据具体的场景需求选择是否采用双缓冲技术。
在数据处理过程中,如果数据的生成速度和消费速度不匹配,缓冲区就可以作为中转站,平衡这两个速度,避免数据丢失或系统瓶颈。 应用缓冲区是指在应用程序中使用的特定内存区域,用于暂存即将发送或接收到的数据。...
在许多实时数据采集和处理的应用中,STM32的定时器、ADC(模拟数字转换器)、DMA(直接内存访问)以及双缓冲技术的结合发挥着关键作用。下面将详细解释这些知识点,并阐述如何在STM32中实现数据采集。 首先,STM32...
环形缓冲区的优势在于其简单性和高效性,特别是在多生产者和多消费者环境中,可以有效地利用内存和处理时间。然而,它们也有局限性,例如当需要频繁检查空/满状态时,可能会产生较多的CPU开销。针对CAN通信的特定...
2. **行缓冲**:行缓冲适用于那些按行输入或输出的情况,比如标准输入(`stdin`)和标准输出(`stdout`)。在这种情况下,缓冲区会在遇到换行符时才触发实际的I/O操作。 3. **无缓冲**:对于一些需要立即响应的场合...