problema de actualización del búfer de impresión

Problema con el búfer de printf

El siguiente contenido puede ser diferente cuando se prueba en Linux y Windows.

1. Introducción

Hay un búfer para la función de salida printf, que se descubrió al usar la prueba de función de suspensión.
Primero, recapitulemos la pregunta de prueba:
simplemente escriba un programa hola mundo

#include <stdio.h>

int main()
{
    
    
    printf("hello world\n");
    sleep(5);  //延迟5秒
     printf("hello friend\n");
    return 0;
}

Resultado de salida: hay un intervalo de 5 segundos entre
inserte la descripción de la imagen aquí
la salida de hola mundo y hola amigo

Cuando modificamos el código: elimine el salto de línea \n después de hola mundo

#include <stdio.h>

int main()
{
    
    
    printf("hello world");
    sleep(5);  //延迟5秒
     printf("hello friend\n");
    return 0;
}

Salida:
inserte la descripción de la imagen aquí
Esta salida es:El cursor parpadea durante 5 segundos y luego aparece hola mundo hola amigo

Aquí encontraremos que: cuando eliminamos el carácter '\n', la función sleep ya no es un retraso entre sentencias, sino un retraso de todo el programa.

Los resultados aquí son muy sorprendentes. Nunca me había dado cuenta ni había pensado en este problema. Entendamos printf en profundidad.

2. Comprensión profunda de printf

printf es una función de búfer de línea, no envía directamente los datos a la pantalla, sino que primero los coloca en el búfer, y solo después de que se cumplan ciertas condiciones, se mostrará el contenido del búfer.

La configuración del búfer es para mejorar la velocidad de E/S y reducir el desperdicio de recursos de la CPU causado por la espera de la E/S de la CPU.

Las siguientes 5 condiciones pueden actualizar el búfer:

1. El búfer está lleno
2. Hay '\n' y '\r' en los caracteres escritos
3. Llame a fflush para actualizar manualmente el búfer
4. Al llamar a scanf para leer datos del búfer, el búfer también será Datos Actualizar dentro de
5. Al final del programa

1. El búfer está lleno

El tamaño del búfer de la función printf es bytes 1024. Cuando se excede el tamaño del búfer, el búfer se actualizará y se imprimirá el resultado.

El tamaño del buffer es de 1024 bytes, este tamaño se obtiene de esta forma, el código es el siguiente:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 /*argc:命令行输入参数个数,argv:命令行参数 
 5  *argv为字符指针数组,argv[i]为指向第i个命令行参数内容的指针
 6  */
 7 int main(int argc, char **argv){
    
     
 8     int i;
 9     char a='a';
10     if(argc != 2) //命令行参数为2,否则出错
11     {
    
    
12         printf("Usage:%s Number\n",argv[0]); 
13         return 0;
14     }
15 
16     for(i=0;i<atoi(argv[1]);i++) //atoi:字符转化为整数
17     {
    
    
18         printf("%c",a);
19     }
20     
21     while(1);  //让程序一直运行
22 }

Resultado de la ejecución:
inserte la descripción de la imagen aquí
Descripción : en Linux, el tamaño del búfer de impresión es de 1024 bytes. while(1) mantiene el programa en ejecución, cuando el búfer no está lleno, no se imprimirá ninguna salida.

2. Hay '\n' y '\r' en los caracteres escritos.

Código de prueba:

#include <stdio.h>

int main()
{
    
    
    printf("hello world\n");//
    sleep(5);  //延迟5秒
     printf("hello friend\n");
    return 0;
}

Resultado de ejecución:
inserte la descripción de la imagen aquí
3. Llame a fflush para actualizar manualmente el búfer

Código de prueba:

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main(void)
{
    
    
    printf("hello world");
    fflush(stdout);
    sleep(5);
    exit(0);
}

Proceso en ejecución y resultados:
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
aquí, después de que finalice la declaración printf, use fflush para forzar la actualización del búfer, luego imprima el contenido primero y luego ejecute la declaración de suspensión.

4. Al llamar a scanf para leer datos del búfer, los datos en el búfer también se actualizarán

Esto lo podemos entender ya que cuando ingresamos desde el teclado, los datos en el data se refrescarán automáticamente.

5. Al final del programa

Código de prueba:

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main(void)
{
    
    
    printf("hello world");
    sleep(5);
    exit(0);
}

resultado de la operación:
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_56935264/article/details/124760432
Recomendado
Clasificación