标准的I/O缓冲:全缓冲|标准的I/O缓冲:全缓冲,行缓冲,无缓冲

先看下面的程序:

标准的I/O缓冲:全缓冲|标准的I/O缓冲:全缓冲,行缓冲,无缓冲
文章图片

在上面的程序中printf函数打印的字符串最后没有带换行符,而且最后调用了_Exit()函数,这导致了最后没有打印出 hello world;
标准的I/O缓冲:全缓冲|标准的I/O缓冲:全缓冲,行缓冲,无缓冲
文章图片
这是因为什么呢???
下面先介绍几种缓冲机制:
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语句。


标准的I/O缓冲:全缓冲|标准的I/O缓冲:全缓冲,行缓冲,无缓冲
文章图片
修正这段代码:

1.在字符串后面加换行符,此时遇到换行符,执行IO操作
2.调用exit()函数,exit函数在进入内核之前先清理缓冲区中的数据,然后关闭IO流
3.可以调用fclose函数达到目的,fclose函数隐含包含了一次fflush操作,把缓冲区内的数据冲洗到终端。

#includeint main() { printf("hello world!"); fclose(stdout); _Exit(0); }



【标准的I/O缓冲:全缓冲|标准的I/O缓冲:全缓冲,行缓冲,无缓冲】转载于:https://blog.51cto.com/10324228/1828883

    推荐阅读