缓冲 与 无缓冲

先看下面的程序:

在上面的程序中printf函数打印的字符串最后没有带换行符,而且最后调用了_Exit()函数,这导致了最后没有打印出 hello world;

这是因为什么呢???

下面先介绍几种缓冲机制:

1、全缓冲 。全缓冲指的是系统在填满标准IO缓冲区之后才进行实际的IO操作;注意,对于驻留在磁盘上的文件来说通常是由标准IO库实施全缓冲。调用fflush函数冲洗一个流。冲洗意味着将缓冲区的内容写到磁盘上。

2、行缓冲 。在这种情况下,标准IO在输入和输出中遇到换行符时执行IO操作;注意,当流涉及终端的时候,通常使用的是行缓冲。

3、无缓冲 。无缓冲指的是标准IO库不对字符进行缓冲存储;注意,标准出错流stderr通常是无缓冲的。

其次介绍几个退出函数:

1、exit ()。调用exit函数之后,它首先会执行一系列的清理处理,包括调用执行各终止处理程序,关闭所有标准IO流等,然后进入内核。

2、_exit ()。与exit不同的是,它不进行清理工作而直接进入内核。此函数由POSIX.1说明,放在unistd.h里面。

3、_Exit ()。同样,它也不进行清理工作而直接进入内核。此函数跟exit一样由ISO C说明,放在stdlib.h里面。

现在再来看上面的代码,发现printf()是行缓冲的,而且打印的字符串没有换行符,因此在他没有遇到换行符或者没有填满缓冲区之前是不会进行实际的I/O操作的,紧接下来的_Exit函数又立即进入内核没有处理I/O缓冲区,所以我们在终端上看不到hello world语句。

修正这段代码:

1.在字符串后面加换行符,此时遇到换行符,执行IO操作

2.调用exit()函数,exit函数在进入内核之前先清理缓冲区中的数据,然后关闭IO流

3.可以调用fclose函数达到目的,fclose函数隐含包含了一次fflush操作,把缓冲区内的数     据冲洗到终端。

#include<stdio.h>

int main()
{
    printf("hello world!");
    fclose(stdout);
    _Exit(0);
}
时间: 2025-01-07 19:09:24

缓冲 与 无缓冲的相关文章

第五篇:使用无缓冲IO函数读写文件

前言 本文介绍使用无缓冲IO函数进行文件读写. 所谓的无缓冲是指该IO函数通过调用系统调用实现,其实系统调用内部的读写实现也是使用了缓冲技术的. 读写步骤 1. 打开文件 open 函数 2. 读写文件 read write 函数 3. 修改文件指针 lseek 函数 ( 可能和 2 交替进行 ) 4. 关闭文件 close 函数 代码示例 1 // 2 // 本程序往一个文件中写入一个整型数组 3 // 然后读取这个数组并输出 4 // 5 6 #include <unistd.h> 7 #

第一章:设置无缓冲

1 #用select, 要先select一个句柄, 用完后记得select回原来的 2 open FILE, ">log.txt"; 3 select FILE; 4 $| = 1; 5 #$|为true时设置FILE为无缓冲 6 print FILE "The log file data"; 7 #print "The log file data"; 8 select STDOUT; 9 #上面的打印不会经过缓冲而直接写进文件log.tx

Golang中的channel代码示例----无缓冲、有缓冲、range、close

// code_043_channel_unbuffered project main.go package main import ( "fmt" "time" ) func main() { c := make(chan int, 0) //无缓冲的通道 //内置函数 len 返回未被读取的缓冲元素数量, cap 返回缓冲区大小 fmt.Printf("len(c)=%d, cap(c)=%d\n", len(c), cap(c)) go f

go语音之进阶篇无缓冲channel

1.无缓冲channel 示例: package main import ( "fmt" "time" ) func main() { //创建一个无缓存的channel ch := make(chan int, 0) //len(ch)缓冲区剩余数据个数, cap(ch)缓冲区大小 fmt.Printf("len(ch) = %d, cap(ch)= %d\n", len(ch), cap(ch)) //新建协程 go func() { for

Linux系统编程之IO_缓冲和非缓冲

下面是一段类似日志记录的代码,已获取通讯的报文内容和当时的环境参数内容,就是创建一个文件,使用标准IO的fopen.fprintf进行输出记录.但是在调试中,刚开始我就傻眼了,文件创建成功了,但是实时查看竟然没有任何数据记录.经过半天的担惊受怕和反复排查,发现是被标准IO的缓冲机制摆了一道,惭愧呀... 代码转自http://blog.csdn.net/mr_chenping/article/details/9166937 下面给出一个示例程序,模拟我的项目程序: #include <stdio

c语言多线程缓冲队列无锁设计思路

公司里开发的一个项目需要在server端添加多线程缓冲队列,来存取数据,我也是初出茅庐没有太多经验,在网上搜集了大量资料后,终于有了一套自己的设计思路,并解决了项目里的问题,因为当时搜集资料时,发现网上这个的具体文章不是太多或者要么太复杂,要么太简陋,对于新手很难能看懂,所有我就打算将我的设计思路发出来,希望能帮助和我一样的同学朋友们,如有不足请指导!谢谢 项目需求: 两个线程,线程1接收客户端数据并有序的存入缓冲队列:线程2从缓冲队列有序的取出数据并解析插入数据库: 解决方法: 1:新建一个结

阶段1 语言基础+高级_1-3-Java语言高级_07 缓冲流_4_缓冲流的效率测试_复制文件

把之前文件复制的代码复制到这里 一个字节一个字节的读取,复制文件 byte数组的形式 缓冲流测试 数组缓冲 原文地址:https://www.cnblogs.com/wangjunwei/p/11270108.html

重定向输出遇到的缓冲问题

来源:http://blog.csdn.net/silyvin/article/details/8281342 一个项目中需要迭代计算,时间长,但是在重定向输出的时候所有标准输出不能及时输出,这就要求程序主函数正常运行完后才能正常输出到文件. 因为标准输出到终端时默认行缓冲或无缓冲,重定向到硬盘之后,就变成了全缓冲 1. Fully buffered means that I/O takes place only when the buffer is fully, the process exp

多缓冲提高日志系统性能

前言:无论什么项目肯定都少不了日志系统,所以一个高性能的日志系统是不可避免的. 本文介绍的是自己用c++11实现的一个简单的多缓冲区日志系统,比较水,仅供参考^_^ 主题: 日志系统及重要性 单缓冲日志系统模型及缺陷 多缓冲buffer介绍及优势 多缓冲区缺陷 Buffer类设计及分析 Logger类设计及分析 日志系统及重要性: 日志信息对于一个优秀项目来说是非常重要的,因为无论再优秀的软件都有可能产生崩溃或异常,此时,日志系统就能发挥它的作用. 快速定位到错误地点以及错误内容,或者查看最近信