什么是行缓冲? 当输入输出遇到换行符的这类缓冲定义为行缓冲。标准输入和标准输出都是行缓冲。 引入缓冲区的目的是什么? 简单的讲,设置缓冲区是为提高IO速度,减少CUP等待IO而浪费CPU资源。
大部分磁盘都是机械硬盘,读取寻道时间和写入寻道时间都是在ms级别。 相对于内存读写速度都非常快,因为内存属于电子设备,读写速度时nm级别的。因此在内存上设置IO缓冲区,相对于从磁盘上读写数据可以显著的提高读写速度。 缓冲区刷新的条件: 1.进程结束。 2.遇到n。 3.缓冲区满。 4.手动刷新缓冲区fflush(stdout)。 5.调用exit(0);但是还可以调用_exit(0),不刷新缓冲区。
下面一一测试缓冲区刷新的条件: (1)进程结束
代码语言:javascript复制#include<stdio.h>
#include<unistd.h>
#include<assert.h>
#inckude<sys/types.h>
int main()
{
pid_t pid = for();
assert(pid != -1);
if(pid == 0)//子进程
{
printf("aaa");
}
else
{
sleep(20);//让子进程先获取CPU的控制权,让子进程先结束
wait();//回收子进程的资源
}
return 0;
}
从执行结果可以看出,当子进程结束后,即进程接受后,缓冲区的内容被输出。
(2)遇到n
。
#include<stdio.h>
#include<unistd.h>
#include<assert.h>
#include<sys/types.h>
int main()
{
printf("hello");//不加`n`
/*printf("hellon"); 加n */
pid_t pid = fork();
assert(pid != -1);
if(pid == 0)
{
printf("world");
}
else
{
wait();
}
return 0;
}
我们对上边两种情况进行对比:
在这里还需要具备的知识,子进程只会拷贝fork
之前父进程缓冲区的内容。
第一种:加n
第二种:不加n
对比图一和图二,为什么不加n
子进程会输出helloworld
而加了n
输出的只有world
呢? 因为n
具备刷新缓冲区的作用
当没有添加n时,父进程缓冲区的内容hello
被拷贝到子进程的缓冲区内,因此当子进程结束的时候会输出helloworld
,而当添加n
时刷新了父进程的缓冲区,所以进程结束的时候输出的只有子进程缓冲区中的内容world
。
(3)缓冲区满
printf函数的缓冲区大小为1024个字节,当超出缓冲区的大小,缓冲区会被刷新。