Mecanismo de búfer de E / S estándar en Linux

Plataforma: sistema operativo Ubuntu

Compilador: g ++

Primero veamos un fragmento de código:

#include <iostream>
#include <unistd.h>
using namespace std;


int main()
{
	for (int i = 0; i < 3; ++i)
	{
		cout << "hello " << i;	//注意,这里没有加换行符
		sleep(1);	//睡眠1秒
	}
}

Compile y ejecute el programa, y ​​descubrió que la consola del terminal no imprimía nada de inmediato, ¡y no fue sino hasta 3 segundos después que todo se imprimió de repente!

¿Por qué está pasando esto? De hecho, el mecanismo de búfer de E / S estándar en Linux está funcionando. Este tipo de mecanismo de almacenamiento en búfer no se utiliza en Windows, por lo que el fenómeno es diferente.

El mecanismo de búfer de E / S estándar en Linux se divide en 3 categorías:

  1.  Totalmente amortiguado. La operación de E / S real se realiza después de que se llena el búfer de E / S estándar. Los archivos que residen en el disco suelen estar completamente almacenados en búfer por la biblioteca de E / S estándar.
  2. Almacenamiento en búfer de línea. La operación de E / S real se realiza solo cuando se encuentra una nueva línea. La terminal de Linux generalmente usa búfer de línea.
  3. Sin búfer. No se realiza ninguna operación de almacenamiento en búfer. El flujo de error estándar stderr no tiene búfer.
  • Observaciones

Independientemente de si se trata de un búfer completo o de un búfer de línea, cuando el programa llama explícitamente al método flush o cuando el programa sale normalmente, el búfer se actualiza y todo el contenido del búfer sale.

El código de muestra es el siguiente:

#include <iostream>
#include <unistd.h>
using namespace std;


int main()
{
	for (int i = 0; i < 3; ++i)
	{
		cout << "hello " << i << flush;	//注意,这里没有加换行符
		sleep(1);	//睡眠1秒
	}
}

Después de agregar la actualización del control de descarga, el programa imprimirá una cadena como "hola 1" inmediatamente después de que se ejecute cout (3 veces en total, con un intervalo de 1 segundo cada vez), en lugar de esperar a que el programa termine antes de todo a la vez. impresión.

Además, existen métodos relacionados en Linux para verificar si el mecanismo de almacenamiento en búfer actual es búfer completo, búfer de línea o sin búfer, e incluso el tamaño del búfer. No se describirá en detalle en este artículo.

 

Supongo que te gusta

Origin blog.csdn.net/gkzscs/article/details/83033337
Recomendado
Clasificación