printf打印数据时,一般会先把数据放入C缓冲区,然后再刷新到内核缓冲区,最后再写入硬件
这个过程中,数据从C缓冲区迁移到内核缓冲区的操作我们称为缓冲(也可以理解为刷新)
下面我们将介绍 缓冲策略的三种情况
1、无缓冲(不刷新),如write
2、行缓冲(行刷新),遇到换行符\n才会刷新
3、全缓冲(缓冲区满了才刷新),如写入数据到磁盘
目录
一、无缓冲(不刷新)
不缓冲的意思就是,不会向内核缓冲区存入内容,而是直接输出到文件中,比如系统调用函数 write函数

1、无缓冲验证
下面用一段简单的代码来验证这一现象,基本思路是:调用write函数向文件里写入内容,使用死循保证当前进程不会退出(退出的时候会刷新缓冲区)。新开一个终端查看文件内容,如果文件中包含了写入的内容,说明是无缓冲;如果不包含写入的内容,说明是其他缓冲。
测试代码如下:
int main(int argc, char** argv){
int fd = open("./1.txt",O_WRONLY | O_APPEND);
const char* buf = "hello, world";
write(fd, buf, strlen(buf)); // 注意这里使用的是strlen,而不是sizeof
// sizeof(buf) 就会变成计算buf指针的大小,那就是固定4个字节
while(1)
{
sleep(1000);
}
close(fd);
return 0;
}
2、验证结果
验证结果如下:

我们发现, 进程还没有退出的情况下,字符串就已经被写入到文件里了,说明write函数没有经过内核缓冲区,直接将数据写入到文件中。
二、行缓冲
行缓冲的意思是,遇到换行符的时候

本文探讨了C语言中无缓冲write、行缓冲printf和全缓冲的原理与验证,通过实例解析了它们的工作方式,并揭示了行缓冲转为全缓冲的特殊情况。
最低0.47元/天 解锁文章
8万+





