- 标准输出的特性
- 标准输出(通常是终端)是行缓冲(line - buffered)设备。当使用
write
函数向标准输出写入数据时,在遇到换行符\n
或者缓冲区满时,就会立即刷新缓冲区并显示内容。 - 例如,在C语言中,
write
函数(write
函数的原型为ssize_t write(int fd, const void *buf, size_t count);
,其中fd
是文件描述符,对于标准输出,fd
为1)写入的数据会先进入缓冲区。但由于终端的行缓冲特性,当写入换行符后,系统会自动将缓冲区的数据输出到屏幕上。
注意:实际测试并不是这样的,我用这样的进行测试,发现可以直接显示,也就是说通过write函数往标准输出上写数据,写什么就马上显示什么,与换行符无关,如下:
write(1, "hello world!", sizeof("hello world!"));
所以上面所说的行缓冲应该指的是说使用标准IO时的情景,即标准IO的将文件模式设置为行缓冲模式(_IOLBF), - 程序也可以通过调用
fflush(stdout)
函数(注意:这个函数也只是刷新了标准IO的缓冲区,与write缓冲区无关)来手动刷新标准输出缓冲区,使得写入的数据立即显示,即使没有遇到换行符。
- 标准输出(通常是终端)是行缓冲(line - buffered)设备。当使用
- 磁盘文件的缓冲机制
- 对于磁盘文件,系统为了提高性能,采用了缓冲策略。当使用
write
函数写入磁盘文件时,数据通常会先被写入到内存中的缓冲区。 - 这个缓冲区的存在是为了减少磁盘I/O操作的次数。因为磁盘I/O是相对较慢的操作,频繁地进行小量的磁盘写入会导致性能下降。
- 系统会在缓冲区满了之后,或者在程序显式地调用文件同步函数(如
fsync
函数,它会将指定文件的所有修改数据刷新到磁盘)。
- 对于磁盘文件,系统为了提高性能,采用了缓冲策略。当使用