¿Qué significa completamente en búfer, con búfer de línea y sin búfer en C? [closed]

4 minutos de lectura

avatar de usuario
hambre4ideas

Encontré una línea que sale de cat El comando está completamente almacenado en búfer. ¿Qué significa?

  • Vaya a su motor de búsqueda favorito y búsquelo allí. Obtendrás miles de buenas respuestas.

    – Un tipo programador

    12 de abril de 2016 a las 12:26

  • ^^ seguro, pero los otros estudiantes ya habrán plagiado todas las buenas respuestas de la primera página. Publicaciones como esta están destinadas a solicitar una respuesta única para que la entregue el OP.

    – Martín James

    12 de abril de 2016 a las 13:01

  • @MartinJames: ¿tan cínico? 😉

    – KevinDTimm

    12 de abril de 2016 a las 13:21

Estándar C11 en línea7.21.3/3:

Cuando una corriente es sin búfer, los caracteres están destinados a aparecer desde el origen o en el destino lo antes posible. De lo contrario, los caracteres pueden acumularse y transmitirse hacia o desde el entorno anfitrión como un bloque. Cuando una corriente es totalmente almacenado en búfer, los caracteres están destinados a transmitirse hacia o desde el entorno del host como un bloque cuando se llena un búfer. Cuando una corriente es línea almacenada en búfer, los caracteres están destinados a transmitirse hacia o desde el entorno del host como un bloque cuando se encuentra un carácter de nueva línea. Además, los caracteres están destinados a transmitirse como un bloque al entorno del host cuando se llena un búfer, cuando se solicita una entrada en un flujo sin búfer o cuando se solicita una entrada en un flujo con búfer de línea que requiere la transmisión de caracteres desde el entorno del host. . El soporte para estas características está definido por la implementación y puede verse afectado a través de la setbuf y setvbuf funciones

7.21.3/7:

Al iniciar el programa, hay tres flujos de texto predefinidos y no es necesario abrirlos explícitamente: entrada estándar (para leer entrada convencional), salida estándar (para escribir salida convencional), y Error estándar (para escribir la salida de diagnóstico). Tal como se abrió inicialmente, el flujo de error estándar no está totalmente almacenado en el búfer; los flujos de entrada estándar y de salida estándar se almacenan en búfer completos si y solo si se puede determinar que el flujo no hace referencia a un dispositivo interactivo.

avatar de usuario
ikegami

[I’m using Perl in the examples for conciseness and ease of reproduction, but the concepts I’m illustrating are not specific to Perl. C works in the same manner.]

El almacenamiento en búfer dicta la frecuencia con la que las cosas escritas en un identificador de archivo se descargan (envían) al sistema operativo. Compare el comportamiento de los siguientes dos comandos:

# With buffering (default)
perl -e'$|=0; print "a"; sleep(2); print "b\n";'

# Without buffering
perl -e'$|=1; print "a"; sleep(2); print "b\n";'

Normalmente, el búfer solo se vacía cuando se llena. La salida con búfer de línea también se vacía cuando se encuentra una nueva línea. Comparar:

perl -e'print "a"; sleep(2); print "b\n";'

perl -e'print "a\n"; sleep(2); print "b\n";'

La mayoría de los programas usan almacenamiento en bloque. Sin embargo, generalmente cambian al búfer de línea para la salida estándar cuando está conectado a una terminal. Comparar:

# Perl's STDOUT is line-buffered when connected to a terminal.
perl -e'print "a\n"; sleep(2); print "b\n";'

# Perl's STDOUT is fully buffered when connected to a pipe.
perl -e'print "a\n"; sleep(2); print "b\n";' | cat

# unbuffer uses pseudo-ttys to fool a program into thinking it's connected to a terminal.
unbuffer perl -e'print "a\n"; sleep(2); print "b\n";' | cat

  • En realidad, lo tienes al revés. Desde man perlvar: $| If set to nonzero, forces a flush right away and after every write or print on the currently selected output channel. Así que 0 es con almacenamiento en búfer y 1 es sin él.

    – Pascual

    26 de marzo de 2018 a las 4:29

  • @Pascall, vaya, arreglado.

    – ikegami

    26 de marzo de 2018 a las 4:31

  • Creo que la intención de su segundo bloque de código fue mostrar lo que sucede con el almacenamiento en búfer de línea. Dado que comienza deshabilitando el almacenamiento en búfer, no creo que muestre lo que pretendía. No he leído tu tercer bloque de código.

    – Pascual

    26 de marzo de 2018 a las 4:57

  • @Pascal, también arreglado.

    – ikegami

    26 de marzo de 2018 a las 5:50

La salida sin búfer escribe bytes desde el archivo de entrada a la salida estándar sin demora a medida que se lee cada uno.

La salida del búfer completo primero lee el archivo completo en secuencia a medida que lo lee y lo almacena en el búfer y muestra el búfer que está listo.

Con la opción -u puedes evitarlo.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad