Linux 下何时输出缓冲区的问题

来源:互联网 发布:java程序编译原理 编辑:程序博客网 时间:2024/05/21 07:46

缓冲区:由多个以不同速度或优先级运行的硬件或程序进程共享的数据存储区,在其中暂时保存数据。

输出缓冲区的4个条件:
1.遇到“\n”,立即刷新缓冲区。
2.程序调用fflush函数刷新缓冲区
3.程序以exit结束,缓冲区会刷新。如果以_exit结束,缓冲区数据会被直接清空。
4.缓冲区满,也会将缓冲区数据刷新出来。

1.遇到“\n”输出

例1:printf()里面不加“\n”

这里写图片描述

运行结果:
这里写图片描述

分析:结果不会立即输出,经过5秒钟后,输出“hello world”。说明hello先存储在缓冲区,world也放在缓冲区,程序结束或遇到特殊条件会一块输出。

例2:printf()里面加上“\n”

这里写图片描述

运行结果:
这里写图片描述
分析:第一次遇到”\n”,输出hello,五秒钟后第二次遇到“\n”,再输出world。

2.fflush,一个计算机函数,功能是冲洗流中的信息,该函数通常用于处理磁盘文件。fflush()会强迫将缓冲区内的数据写回参数stream指定的文件中。

原型:int fflush ( FILE* stream );
fflush(stdin)刷新标准输入缓冲区,
fflush(stdout)刷新标准输出缓冲区

例3:不使用“\n”,用fflush刷新缓冲区

这里写图片描述

运行结果:
这里写图片描述

分析:hello首先存放在缓冲区,遇到fflush(),刷新缓冲区,输出hello,睡眠5秒钟后,world存放在缓冲区,遇exit(),刷新缓冲区,输出world。

3.exit是用于结束正在运行的整个程序,它将参数返回给操作系统,把控制权交给操作系统。

常与exit进行比较的是return,return是退出当前函数,返回函数值,把控制权交给调用函数。

(1)exit和_exit都是用来终止进程的,当程序执行到exit和 _exit时,系统会停止剩下所有操作,清除包括PCB在内的各种数据结构,并终止本进程的运行。
(2)exit中的头文件为stdio.h,_exit 的头文件为unistd.h。exit中的参数为0代表进程正常终止,若为其他值则表示程序执行过程中有错误发生。
(3)区别:
a._exit()执行后立即返回给内核,而exit要先执行一些清楚操作,然后将控制权交给内核。
b.调用_exit函数时,其会关闭进程所有的文件描述符,清理内存以及其他一些内核清理函数,但不会刷新流(stdin,stdout……);exit函数是在 _exit函数之上的一个封装,其会调用 _exit,并在调用之前刷新流。

例4:用以下代码进行比较,都不加“\n”,左边用exit结束,右边用_exit结束:

这里写图片描述

运行结果:
左边程序hello存放在缓冲区,5秒钟后world存放在缓冲区,遇到exit结束,在程序结束之前会刷新缓存,所以输出helloworld
右边程序hello存放在缓冲区,5秒钟后world存放在缓冲区,用_exit结束,因为它会直接清理内存,但不会刷新缓存,所以什么都不会输出

例5:hello后面加“\n”,左边用exit结束,右边用_exit结束:

这里写图片描述

运行结果:左边第一次遇到“\n”,输出hello,五秒钟后world存放在缓冲区,遇到exit输出world
右边输出第一次遇到“\n”,输出hello,五秒钟后什么都没输出,world被_exit清理。

例6:hello和world后面都加“\n”,左边用exit结束,右边用_exit结束:

这里写图片描述
运行结果:
左边遇到“\n”,输出hello,五秒钟后遇到“\n”,输出world。最后遇到exit结束程序。
右边遇到“\n”,输出hello,五秒钟后遇到“\n”,输出world。在遇到_exit之前缓冲区里的内容已经输出。

原创粉丝点击